POJ-1273-Drainage Ditches
http://poj.org/problem?id=1273
基本的最大流,Ford-Fulkerson算法,按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;
}