HDU1532----Drainage Ditches

来源:互联网 发布:视频讲课软件 编辑:程序博客网 时间:2024/06/07 14:49

网络流最大流。

dinic

参考

#include<stdio.h>#include<string.h>#include<queue>#include<algorithm>using namespace std;#define inf 0xffffffint N,M,S;int edg[250][250];int dis[250];int q[2000],h,r;int BFS(){    int i,u;    memset(dis,-1,sizeof dis);    dis[1]=0;    queue<int>q;    q.push(1);    while(!q.empty()){        u=q.front();        q.pop();        for(i=1;i<=N;i++)            if(dis[i]<0&&edg[u][i]>0)            {                dis[i]=dis[u]+1;//层次                q.push(i);            }    }    if(dis[N]>0)        return 1;    else return 0;//不能到达汇点}int find(int x,int low){    int i,t=0;    if(x==N) return low;    for(i=1;i<=N;i++)    if(edg[x][i]>0&&//联通       dis[i]==dis[x]+1&&//是下一层       (t=find(i,min(low,edg[x][i]))))//可以到达汇点        {            edg[x][i]-=t;            edg[i][x]+=t;//反向弧            return t;        }    return 0;}int main(){    while(scanf("%d%d",&M,&N)!=EOF){        memset(edg,0,sizeof edg);        int si,ei,ci,tt;        for(int i=1;i<=M;i++){            scanf("%d%d%d",&si,&ei,&ci);            edg[si][ei]+=ci;        }        S=0;        while(BFS())        {            while(tt=find(1,0xffffff)) S+=tt;        }        printf("%d\n",S);    }}


0 0
原创粉丝点击