poj 1273 最大流问题

来源:互联网 发布:临高启明实体书 淘宝 编辑:程序博客网 时间:2024/05/21 19:01

  本题为网络流中最水的最大流问题,,,我用的是EDmonds karp 算法,。,,主要是寻找增光路。。。首先从第一个点出发,,,然后用广搜往下进行。,,将沿途所有点设为前边路径的最小值。。。接下来,,,回溯以前的点。。。将流量替换为盛余留,,,

题目连接

http://poj.org/problem?id=1273

#include<stdio.h>#include<string.h>#include<queue>using namespace std;const int INF = 0x7FFFFFFF;int end,st[210][210],m,n,fl[210],vi[210];queue<int> q;int dfs(){while(!q.empty())q.pop();q.push(1);fl[1]=INF;     memset(vi,0,sizeof(vi)); vi[1]=1;while(!q.empty()){int t=q.front();q.pop();if(t==n)break;for(int i=1;i<=n;i++){if(i!=1&&!vi[i]&&st[t][i]){fl[i]=fl[t]<st[t][i]?fl[t]:st[t][i];vi[i]=t;q.push(i);}}}if(vi[n]==0)return 0;return fl[n];}int ed(){int max=0,xz,qb,ste;while((ste=dfs())!=0){max+=ste;xz=n;while(xz!=1){qb=vi[xz];st[qb][xz]-=ste;st[xz][qb]+=ste;xz=qb;}}return max;}int main(){while(scanf("%d%d",&m,&n)!=EOF){int a,b,c;memset(st,0,sizeof(st));for(int i=0;i<m;i++){scanf("%d%d%d",&a,&b,&c);st[a][b]+=c;}printf("%d\n",ed());}return 0;}