额,又做了一遍哈,不过有一段时间没学最大流了,就当是复习复习挺好!
View Code
#include <stdio.h>
#include <string.h>
#define N 202
int map[N][N];
int queue[N];
int pre[N];
int Edmonds_Karp(int start,int end,int n)
{
int i,cur,front,rear;
int maxflow=0;
while(true)
{
front=rear=0; queue[rear]=start;
memset(pre,-1,sizeof(pre)); pre[start]=0;
while(front<=rear)
{
cur=queue[front++];
for(i=1;i<=n;i++)
{
if(map[cur][i] && pre[i]==-1)
queue[++rear]=i,pre[i]=cur;
}
if(pre[end]!=-1) break;
}
if(pre[end]==-1) break;
int minflow=0x7fffffff;
for(cur=end;cur!=start;cur=pre[cur])
{
if(minflow>map[pre[cur]][cur])
minflow=map[pre[cur]][cur];
}
maxflow+=minflow;
for(cur=end;cur!=start;cur=pre[cur])
{
map[pre[cur]][cur]-=minflow;
map[cur][pre[cur]]+=minflow;
}
}
return maxflow;
}
int main()
{
int n,m;
int i,v,u,flow;
//freopen("input.txt","r",stdin);
while(scanf("%d %d",&n,&m)!=EOF)
{
memset(map,0,sizeof(map));
for(i=0;i<n;i++)
{
scanf("%d %d %d",&v,&u,&flow);
map[v][u]=flow;
}
printf("%d\n",Edmonds_Karp(1,m,m));
}
return 0;
}
这个Edmonds_Karp看这就是舒服呵,不想Dinic那么复杂!
就是不断找增广路。。。直到没有增广路。。。结束!
需要注意的是,这里的亮点是:pre[N]这个数组,记录路线的数组,挺不错的!