http://acm.hdu.edu.cn/showproblem.php?pid=1532 #include<iostream> #include<queue> using namespace std; #define N 201 #define M 201 struct Graph { struct node { int v,next,w; node(){}; node(int a,int b,int c):next(a),v(b),w(c){}; }E[M*2]; int pre[N]; //存前驱 int head[N]; int path[N];//记录这个点是哪条边 int NV,NE; void init(int n) { memset(head,-1,sizeof(head)); NE=0; NV=n; } void insert(int u,int v,int w) { E[NE]=node(head[u],v,w); head[u]=NE++; } int EK(int s,int t) { int maxflow=0; while(true) { queue<int> q; memset(pre,-1,sizeof(pre)); q.push(s);// 每次都从源点开始找路 while(!q.empty()) { int u=q.front(); q.pop(); for(int i=head[u];i!=-1;i=E[i].next) { int v=E[i].v; if(pre[v]==-1&&E[i].w>0) //如果这个点没找过且容量大于0 { pre[v]=u; q.push(v); path[v]=i;//记录v这个点的边编号 } } if(pre[t]!=-1) //已经到达汇点了跳出 break; } if(pre[t]==-1) //如果已经不能到达汇点了,跳出大循环,说明路径已经遍历完了 break; int Min=INT_MAX; for(int v=t;v!=s;v=pre[v]) { if(E[path[v]].w<Min) Min=E[path[v]].w; //在找到的路径所有点中,找一个最小的容量 } for(int v=t;v!=s;v=pre[v]) { E[path[v]].w-=Min; E[path[v]^1].w+=Min; //正向边减去这个容量,反向边加上这个容量 } maxflow+=Min; } return maxflow; } }G; int main(void) { int n,m; while(~scanf("%d%d",&m,&n)) { G.init(n); while(m--) { int u,v,w; scanf("%d%d%d",&u,&v,&w); G.insert(u,v,w); G.insert(v,u,0);//反向边容量初始为0 } printf("%d/n",G.EK(1,n)); } }