POJ - 1273 Drainage Ditches (网络流入门题)

来源:互联网 发布:淘宝联盟api是什么 编辑:程序博客网 时间:2024/05/29 07:25
题目大意:
每当下雨,农夫最喜爱的养尊处优的地方周围就变成了一个池塘,这让他很不爽,所以决心要把这个问题解决掉,所以他就在四周建造了一些渠沟以便排水,更为巧妙地是可以把这水排到一个小溪处。
编号为1的节点作为池塘,编号为n的地方作为小溪。求最大排水量。

解析:

网络流算法的入门题,注意有重边,所以如果出现重边,就把那条路径加上重边,等价于把那条边给扩大了。

#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int INF = 0x3f3f3f3f;const int N = 205;int flow[N][N],cap[N][N];int a[N],p[N];int m,n;int maxflow(int s ,int t) {queue<int> que;memset(flow,0,sizeof(flow));int f = 0;while(true) {memset(a,0,sizeof(a));a[s] = INF;que.push(s);while(!que.empty()) {int u = que.front();que.pop();for(int v = 1; v <= n; v++) {if(!a[v] && cap[u][v] > flow[u][v]) {p[v] = u;que.push(v);a[v] = min(a[u],cap[u][v] - flow[u][v]);}}}if(a[t] == 0) {break;}for(int u = t; u != s; u = p[u]) {flow[p[u]][u] += a[t];flow[u][p[u]] -= a[t];}f += a[t];}return f;}int main() {int u,v,w;while(scanf("%d%d",&m,&n) != EOF) {memset(cap,0,sizeof(cap));for(int i = 0; i < m; i++) {scanf("%d%d%d",&u,&v,&w);cap[u][v] += w;}int ans = maxflow(1,n);printf("%d\n",ans);}return 0;}

0 0