简单最大流问题
有重边,流量要累加上
#include<stdio.h> #include<queue> #include<string.h> using namespace std; #define N 20 #define inf 0x3fffffff int n,m; int map[N][N],inq[N],d[N],pre[N]; bool bfs()//找增广路 { queue<int>Q; memset(inq,0,sizeof(inq)); memset(pre,0,sizeof(pre)); Q.push(1); inq[1]=1; while(!Q.empty()) { int u=Q.front(); Q.pop(); for(int i=1;i<=n;i++) { if(!inq[i]&&map[u][i]) { inq[i]=1; pre[i]=u; Q.push(i); } } } if(pre[n]==0)//找不到增广路 return 0; return 1; } int update() { int q=inf,u; u=n; while(u!=1) { if(q>map[pre[u]][u]) q=map[pre[u]][u]; u=pre[u]; } u=n; while(u!=1) { map[pre[u]][u]-=q; map[u][pre[u]]+=q; u=pre[u]; } return q; } int main() { int i,j,x,y,z,sum,t,op=1; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); sum=0; memset(map,0,sizeof(map)); for(i=0;i<m;i++) { scanf("%d%d%d",&x,&y,&z); map[x][y]+=z;//重边的流量要加上 } while(bfs())//找不到增广路,解求出 sum+=update(); printf("Case %d: %d\n",op++,sum); } return 0; }
作者:aixiaoling1314 发表于2013-4-26 12:50:03 原文链接
阅读:62 评论:0 查看评论