比赛 |
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;
}