您的位置:首页 > 其它

poj1273最大流dinc

2014-07-27 15:44 435 查看
bfs 构建层次图,dfs 寻找增广路。dfs在寻找增广路的同时自我调整直到此时的层次图无增广路时 重新构图,直到无增广路为止。

对于添加反弧,觉得对于每点 进流量和 出流量应该守恒,反向弧的添加方便自我调整,而通过每点的流量没变,最后导致流到终点的流量不变。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <map>
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>
using namespace std;

const int maxn= 222;
const int INF=0xfffffff;
int Min(int a,int b)
{
return a>b?b:a;
}
int Map[maxn][maxn];
int n;int m;
int l[maxn];
int s;int e;
bool  bfs()
{
queue<int > q;
q.push(s);
memset(l,0,sizeof(l));
l[s]=1;
while(!q.empty()){
int cur=q.front(); q.pop();
for(int i=1;i<=m;i++){
if(!l[i]&&Map[cur][i]){
l[i]=l[cur]+1;
q.push(i);
}
}
}
return l[e];
}

int dfs(int x,int val)
{
int tem=val;
if(x==e) return val;
for(int i=1;i<=m&&tem;i++){
if(l[i]==l[x]+1&&Map[x][i]){
int t=dfs(i,Min(Map[x][i],tem));
Map[x][i]-=t;Map[i][x]+=t;
tem-=t;
}
}
return val-tem;
}

int solve()
{
int ans=0;int t;
while(bfs()){
while(t= dfs(1,INF)){
ans+=t;
}
}
return ans;
}
int main()
{
while(cin>>n>>m){
int a;int b;int c;
memset(Map,0,sizeof(Map));
for(int i=0;i<n;i++){
cin>>a>>b>>c; Map[a][b]+=c;
}
s=1;e=m;
cout<<solve()<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: