HDU1532 Drainage Ditches【最大流】【Edmond-Karp】
原创
©著作权归作者所有:来自51CTO博客作者ITCharge的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1532
题目大意:
约翰要修建水沟用来排放农场的雨水,该水沟系统是一个网络流,总共有N条边,M个节点。
1是源点,M是汇点。求最大流是多少。
思路:
同样是网络流求最大流的裸题。直接用Edmond-Karp算法来做就可以了。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN = 220;
int Map[MAXN][MAXN],pre[MAXN];
int N,M;
bool EkBFS(int start,int end)
{
queue<int> Q;
bool vis[MAXN];
memset(vis,false,sizeof(vis));
memset(pre,-1,sizeof(pre));
Q.push(start);
vis[start] = true;
while(!Q.empty())
{
int u = Q.front();
if(u == end)
return true;
Q.pop();
for(int i = 0; i <= N; ++i)
{
if(Map[u][i] && !vis[i])
{
vis[i] = true;
pre[i] = u;
Q.push(i);
}
}
}
return false;
}
int EkMaxFlow(int start,int end)
{
int v,Ans = 0,MinN;
while(EkBFS(start,end))
{
MinN = 0xffffff0;
v = end;
while(pre[v] != -1)
{
MinN = min(MinN,Map[pre[v]][v]);
v = pre[v];
}
Ans += MinN;
v = end;
while(pre[v] != -1)
{
Map[pre[v]][v] -= MinN;
Map[v][pre[v]] += MinN;
v = pre[v];
}
}
return Ans;
}
int main()
{
int u,v,w;
while(~scanf("%d%d",&M,&N)) //转换为M条边,N个节点
{
memset(Map,0,sizeof(Map));
for(int i = 0; i < M; ++i)
{
scanf("%d%d%d",&u,&v,&w);
Map[u][v] += w;
}
printf("%d\n",EkMaxFlow(1,N));
}
return 0;
}