【最大流(EK)】hdu 3549 Flow Problem

来源:互联网 发布:国际顶级域名干嘛的 编辑:程序博客网 时间:2024/05/29 04:46

http://acm.hdu.edu.cn/showproblem.php?pid=3549

分析:最大网络流的EK算法


#include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;const int NM=20;const int MAX=0xfffffff;int a[NM][NM],pre[NM],n,m,ans;bool vis[NM];bool BFS(int s,int d){queue<int>q1;memset(vis,0,sizeof(vis));memset(pre,0,sizeof(pre));q1.push(s);pre[s]=s;vis[s]=1;while(!q1.empty()){int t=q1.front();q1.pop();for(int i=1;i<=n;i++){if(!vis[i]&&a[t][i]){vis[i]=1;pre[i]=t;if(i==d) return true;q1.push(i);}}}return false;}void EK(int s,int d){int v,i;while(BFS(s,d)){v=MAX;for(i=d;i!=s;i=pre[i]){if(v>a[pre[i]][i])v=a[pre[i]][i];}for(i=d;i!=s;i=pre[i]){a[pre[i]][i]-=v;a[i][pre[i]]+=v;  //逆向回溯}ans+=v;}}int main(){int T,i,x,y,v,j;scanf("%d",&T);j=1;while(T--){scanf("%d%d",&n,&m);memset(a,0,sizeof(a));for(i=0;i<m;i++){scanf("%d%d%d",&x,&y,&v);a[x][y]+=v;  //重边}ans=0;EK(1,n);printf("Case %d: %d\n",j++,ans);}return 0;}


0 0