POJ-1273-Drainage Ditches
http://poj.org/problem?id=1273
基本的最大流,按LRJ的白书写的
#include<iostream> #include<cstring> #include<queue> using namespace std; #define INF 0x7fffffff int 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; }