Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
求纠错#include "stdio.h" #define maxn 20012 #define maxm 200012 #define inf 200000000 struct hp { int c,f,next,to; }edge[5*maxm]; int head[2*maxn+2],flag[2*maxn+2],level[2+2*maxn],n,m,vs,vt,m1; int bfs() { int u,v,front,rear,queue[maxn],i; memset(flag,0,sizeof(flag)); flag[vs]=1; level[vs]=0; front=-1; rear=0; queue[rear]=vs; while(front<rear) { front++; u=queue[front]; if(u==vt) return 1;/*找到vt*/ for(i=head[u];i!=-1;i=edge[i].next) { v=edge[i].to; if(!flag[v] && edge[i].c>edge[i].f) { flag[v]=1; level[v]=level[u]+1; rear++; queue[rear]=v; } } } return 0; } int min(int a,int b) { if(a<b) return a; return b; } int dfs(int u,int a) { int i,flow,v,sum=a; if(u==vt) return a; for(i=head[u];i!=-1;i=edge[i].next) { v=edge[i].to; if(level[v]==level[u]+1 && edge[i].f<edge[i].c) { flow=dfs(v,min(a,edge[i].c-edge[i].f)); edge[i].f+=flow; edge[i-1].f-=flow; a-=flow; } } if(sum==a) level[u]=-1; return sum-a; } void dinic() { while(bfs()) dfs(vs,inf);/*dfs(v0,a)*/ } void build(int u,int v,int c) { edge[m1].c=c; edge[m1].to=v; edge[m1].next=head[u]; head[u]=m1; m1++; edge[m1].c=0; edge[m1].to=u; edge[m1].next=head[v]; head[v]=m1; m1++; } void out() { int i,maxflow=0; for(i=head[vs];i!=-1;i=edge[i].next) maxflow+=edge[i].f; printf("%d\n",maxflow); } void init() { int i,a,b,u,v,c; while(scanf("%d%d",&n,&m)!=EOF) { vs=0; vt=2*n+1; memset(head,0xff,sizeof(head)); memset(edge,0,sizeof(edge)); for(i=0;i<=2*m-1;i++) edge[i].next=-1; for(i=1;i<=n;i++) { build(i,i+n,inf); scanf("%d%d",&a,&b); build(vs,i,a); build(i+n,vt,b); } for(i=1;i<=m;i++) { scanf("%d%d%d",&u,&v,&c); build(u,v+n,c); build(v,u+n,c); } dinic(); out(); } } int main() { init(); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator