poj1273 Drainage Ditches 最大流EK

来源:互联网 发布:淘宝卖家交保证金 编辑:程序博客网 时间:2024/05/17 01:07

题目是要求一个最大流,给出的数据是容量C。1是源点,m是汇点。用朴素的EK算法,不断寻求增广路,如果找到了汇点就从汇点开始,正向弧加上一个增广路的最小值,反向弧减去增光路的最小值,当没有找到汇点的时候退出。

#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<queue>#include<cmath>#include<cctype>using namespace std;#define MIN(a,b) (a)<(b)? a:b#define INF 2000000int n,m;int a[205][205];int pre[205],flag[205];int Min;int EK(int beg,int End){    int ret=0;    while(1)    {        memset(flag,0,sizeof(flag));        memset(pre,0,sizeof(pre));        Min=INF;        queue<int>q;        q.push(beg);        while(!q.empty())        {            int t=q.front();            q.pop();            if(flag[t])                continue;            flag[t]=1;            for(int i=1;i<=m;i++)            {                if(!flag[i]&&a[t][i]>0)                {                    pre[i]=t;                    Min=MIN(a[t][i],Min);                    q.push(i);                }            }        }            int j=m;            while(pre[j])            {                a[pre[j]][j]-=Min;                a[j][pre[j]]+=Min;                j=pre[j];            }            if(pre[End] == 0)                break;            else                ret+=Min;    }    return ret;}int main(){    while(cin>>n>>m)    {        memset(a,0,sizeof(a));        for(int i=1;i<=n;i++)        {            int x,y,z;            cin>>x>>y>>z;            a[x][y]+=z;//这个地方不累加就WA了。应该是有这样的数据。        }        cout<<EK(1,m)<<endl;    }    return 0;}


原创粉丝点击