69,371
社区成员
发帖
与我相关
我的任务
分享
/*
题目:poj 1273 Drainage Ditches (网络流最大流)
题意:
有n道水渠,和m个节点,其中每道水渠都有一个最大流
问从1节点到m节点的最大流
Sample Input
5 4
1 2 40
1 4 20
2 4 20
2 3 30
3 4 10
Sample Output
50
解题:
最大流 利用 edmonds_karp算法 bfs
*/
#include<stdio.h>
#include<string.h>
#define M 230
#define INF 0x7FFFFFFF
#define min(a,b) a<b?(a):(b)
/* f[i]存储第i点存储的水 residual[i][j]存储从i到j水渠的剩余流量 pre存储前驱节点*/
int residual[M][M],pre[M],f[M],q[M];
int n,m;
void input()
{
int x,y,z;
memset(residual,0,sizeof(residual));
for(int i=0;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);
residual[x][y]+=z;/* 因为存在回路 */
}
}
int bfs()
{
for(int i=1;i<=m;i++)
f[i]=INF;
q[0]=1;
memset(pre,-1,sizeof(pre));
int head=-1,tail=0,cur;
while(head<tail)
{
++head;
cur=q[head];
if(cur==m)
return f[m];
for(int i=1;i<=m;i++)
{
/*如果该点已经走过或者从cur到i的水渠的流量为0时*/
if(pre[i]!=-1||residual[cur][i]==0)
continue;
pre[i]=cur;
f[i]=min(f[cur],residual[cur][i]);
++tail;
q[tail]=i;
}
}
return -1;
}
int EK()
{
int ans=0;
while(1)
{
int tmp=bfs();
if(tmp==-1)
return ans;
ans+=tmp;
int a=m;
int b;
while(a!=1)
{
b=pre[a];
residual[b][a]-=tmp;/* 正向流减小 */
residual[a][b]+=tmp;/* 反向流增加 */
a=b;
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)==2)
{
input();
printf("%d\n",EK());
}
return 0;
}