比赛 20120720 评测结果 AAAAAAAAAA
题目名称 长途奔袭 最终得分 100
用户昵称 了反取字名我擦 运行时间 2.001 s
代码语言 C++ 内存使用 2.05 MiB
提交时间 2012-07-20 11:41:37
显示代码纯文本
#include<fstream>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<cstdio>
#include<string>
#include<list>
#include<vector>
#include<deque>
#include<queue>
#include<map>

using namespace std;
ifstream fi("YZ.in");
ofstream fo("YZ.out");

const int INF=2000000000;
typedef struct edge
{
	int t,c,v;
	edge *next,*op;
};
edge E[50001],*V[2001];
int n,m,S=0,T=2000,eh=0;
inline void add_edge(int a,int b,int c,int v)
{
	E[++eh].next=V[a];V[a]=E+eh;V[a]->t=b;V[a]->c=c;V[a]->v=v;
	E[++eh].next=V[b];V[b]=E+eh;V[b]->t=a;V[b]->c=0;V[b]->v=-v;
	V[a]->op=V[b];V[b]->op=V[a];
}
int d[2001],q[200001],qt,qw,ansv;
edge *P[2001];
bool spfa()
{
	qt=qw=0;
	for(int i=1;i<=2000;i++)
	{
		d[i]=INF;
	}
	d[S]=0;q[0]=S;
	while(qt<=qw)
	{
		int u=q[qt++];
		for(edge *e=V[u];e;e=e->next)
			if(e->c)
				if(d[e->t]>d[u]+e->v)
				{
					d[e->t]=d[u]+e->v;q[++qw]=e->t;P[e->t]=e;
				}
	}
	return(d[T]!=INF);
}
void modifyflow()
{
	int flow=INF;
	for(edge *e=P[T];e;e=P[e->op->t])
		flow=min(flow,e->c);
	for(edge *e=P[T];e;e=P[e->op->t])
	{
		ansv+=flow*e->v;e->c-=flow;e->op->c+=flow;
	}
}
void spfaflow()
{
	while(spfa())
	{
		modifyflow();
	}
}
int main()
{
	fi>>n>>m;
	add_edge(S,1999,n,0);
	int t;
	for(int i=1;i<=n;i++)
	{
		fi>>t;
		add_edge(1999,i+n,1,t);
		add_edge(i+n,T,1,0);
		add_edge(S,i,1,0);
	}
	int t1,t2,t3;
	for(int i=0;i<m;i++)
	{
		fi>>t1>>t2>>t3;
		if(t1>t2)swap(t1,t2);
		add_edge(t1,t2+n,1,t3);
	}
	spfaflow();
	fo<<ansv;
	fi.close();
	fo.close();
	return 0;
}