码迷,mamicode.com
首页 > 其他好文 > 详细

poj1273最大流dinc

时间:2014-07-27 22:19:49      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   os   io   for   div   amp   

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;
}

 

poj1273最大流dinc,布布扣,bubuko.com

poj1273最大流dinc

标签:style   blog   color   os   io   for   div   amp   

原文地址:http://www.cnblogs.com/yigexigua/p/3871466.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!