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;
}
更多详细信息请查看 java教程网 http://www.itchm.com/forum-59-1.html