poj1273最大流dinc

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;

}

 

你可能感兴趣的:(poj)