POJ-1273-Drainage Ditches

来源:互联网 发布:五子棋雾化器做芯数据 编辑:程序博客网 时间:2024/03/28 23:43

POJ-1273-Drainage Ditches

http://poj.org/problem?id=1273

基本的最大流,Ford-Fulkerson算法,按LRJ的白书写的

#include<iostream>#include<cstring>#include<queue>using namespace std;#define INF 0x7fffffffint main(){int n,m;int from,to,w,f;int u,v;int cap[201][201],flow[201][201];int a[201];  //起始点到每个节点的最小残量,a[i]总是正数,代替visit标记数组int p[201];queue<int>q;while(scanf("%d%d",&m,&n)!=EOF){memset(cap,0,sizeof(cap));memset(flow,0,sizeof(flow));while(m--){scanf("%d%d%d",&from,&to,&w);cap[from][to]+=w;}f=0;for(;;){memset(a,0,sizeof(a));a[1]=INF;q.push(1);while(!q.empty())  //BFS找增广路{u=q.front();q.pop();for(v=1;v<=n;v++)if(!a[v]&&cap[u][v]>flow[u][v]){p[v]=u;  //记录v的父亲,并加入队列q.push(v);a[v]=a[u]<(cap[u][v]-flow[u][v])?a[u]:(cap[u][v]-flow[u][v]);  //最小残量}}if(a[n]==0)  //找不到,则当前流已经是最大流break;for(u=n;u!=1;u=p[u])  //从汇点往回走{flow[p[u]][u]+=a[n];  //更新正向流量flow[u][p[u]]-=a[n];  //更新反向流量}f+=a[n];  //更新从源点流出的总流量}printf("%d\n",f);}return 0;}


原创粉丝点击