hdu 1532 EK模板2 0是原点m是汇点

#include <iostream>
#include <string.h>
using namespace std;
 

#include <queue>
#define min(x,y) (x<y?x:y)
const int inf = 1000000000;
const int maxn = 210;
int cap[maxn][maxn];
int n,m;
int s,t;
int flow[maxn][maxn],d[maxn],parent[maxn],maxflow;
 

void Edmonds_Karp(int s,int t,int nnum)
{
    maxflow = 0;
    memset(flow,0,sizeof(flow));
    memset(parent,0,sizeof(parent));
    while(true)
    {
        memset(d,0,sizeof(d));
        queue<int>que;
        d[s]=inf;
        que.push(s);
        while(!que.empty())             //BFS寻找增广路
        {
            int u = que.front();
            que.pop();
            for(int v=0; v<nnum; ++v)
            {
                if(!d[v] && cap[u][v]>flow[u][v])            //找到新结点v
                {
                    parent[v] = u;                           //记录v的父亲,并参加FIFO队列
                    que.push(v);
                    d[v] = min(d[u],cap[u][v]-flow[u][v]);  //s-v路径上的最小残量
                }
            }
        }
        if(0==d[t])                    //找不到,则当前流已经是最大流
            break;
        for(int u=t;u!=s;u=parent[u])  //从汇点往回走
        {
            flow[parent[u]][u]+=d[t];  //更新正向流
            flow[u][parent[u]]-=d[t];  //更新反向流
        }
        maxflow += d[t];                 //更新从s流出的总流量
    }
}
int main()
{
    while(cin>>n>>m)
    {
        memset(cap,0,sizeof(cap));
        while(n--)
        {
            int temps,tempe,c;
            cin>>temps>>tempe>>c;
            cap[temps-1][tempe-1]+=c;   //处理惩罚重边
        }
        Edmonds_Karp(0,m-1,m);
        cout<<maxflow<<endl;
    }
    return 0;
}

  

posted @ 2012-04-10 08:18  shijiwomen  阅读(184)  评论(0编辑  收藏  举报