POJ1273 Drainage Ditches 简单网络流

来源:互联网 发布:网络相关知识 编辑:程序博客网 时间:2024/06/01 08:02

Problem Address:http://poj.org/problem?id=1273


【前言】


本来图算法不应该我负责的,不过刚好有点烦,所以拿过来学习一下,当是补充知识。

翻了算法导论,看了相关部分,发现网络流其实不是很难理解。

于是开题。


【思路】


简单网络流。

注意有重边的情况,需要叠加。

网络流的思路还是很简单的,就是bfs+迭代。

广搜查询是否存在从源点到汇点的路径,找出其最小流量,更新路径上的点,并更新流量值。

然后循环查询和更新,直到不再存在路径。


【代码】


#include <iostream>using namespace std;const int maxn = 200;const int MAX = 99999999;int map[maxn+5][maxn+5];int pre[maxn+5];int q[maxn*maxn];void init_map(int size){int i,j;for (i=1; i<=size; i++){for (j=1; j<=size; j++){map[i][j] = 0;}}}bool bfs(int s, int t, int size){int head, tail, u, v;memset(pre, -1, sizeof(pre));head = 1;tail = 0;q[tail] = s;while(tail<head){u = q[tail];for (v=1; v<=size; v++){if (pre[v]==-1 && map[u][v]>0){pre[v] = u;q[head] = v;head++;if (v==t)return true;}}tail++;}return false;}int solve(int s, int t, int size){int u, v, inc, maxflow = 0;while(bfs(s, t, size)){inc = MAX;for (v=t; v!=s; v=u){u = pre[v];if (map[u][v]<inc)inc = map[u][v];}for (v=t; v!=s; v=u){u = pre[v];map[u][v] -= inc;map[v][u] += inc;}maxflow += inc;}return maxflow;}int main(){int n,m,s,e,c;int i;while(scanf("%d %d", &n, &m)!=EOF){init_map(m);for (i=0; i<n; i++){scanf("%d %d %d", &s, &e, &c);map[s][e] += c;}printf("%d\n", solve(1, m, m));}return 0;}


原创粉丝点击