标签:
题目链接:
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; }
HDU1532 Drainage Ditches【最大流】【Edmond-Karp】
标签:
原文地址:http://blog.csdn.net/lianai911/article/details/43956925