poj 1273 Drainage Ditches (最大流入门)
Posted pb2016
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj 1273 Drainage Ditches (最大流入门)相关的知识,希望对你有一定的参考价值。
1 /****************************************************************** 2 题目: Drainage Ditches(POJ 1273) 3 链接: http://poj.org/problem?id=1273 4 题意: 现在有m个池塘(从1到m开始编号,1为源点,m为汇点),及n条 5 水渠,给出这n条水渠所连接的池塘和所能流过的水量,求水 6 渠中所能流过的水的最大容量.水流是单向的。 7 算法: 最大流之增广路(入门) 8 算法思路: 不断用BFS找通路,没每找一条路,记录这条路的最小流,再 9 给这条路上的所有流量减去这个最小值。 10 *********************************************************************/ 11 #include<cstdio> 12 #include<iostream> 13 #include<cstring> 14 #include<algorithm> 15 #include<queue> 16 using namespace std; 17 18 const int mx=222; 19 int cap[mx][mx]; ///两个端点的流量。 20 int flow[mx][mx]; ///两个端点已用的流量。 21 int a[mx],father[mx]; 22 int m,n; 23 24 int bfs() 25 { 26 queue<int>q; 27 int ans=0; 28 father[1]=-1; 29 while (1) 30 { 31 memset(a,0,sizeof(a)); 32 a[1]=1000000000; 33 q.push(1); 34 ///找增广路 35 while (!q.empty()) 36 { 37 int u=q.front(); 38 q.pop(); 39 for (int v=2;v<=n;v++) 40 { 41 if (!a[v]&&cap[u][v]>flow[u][v]) 42 { 43 father[v]=u; 44 q.push(v); 45 a[v]=min(a[u],cap[u][v]-flow[u][v]); 46 } 47 } 48 } 49 if (a[n]==0) return ans; 50 for (int u=n;father[u]!=-1;u=father[u]) 51 { 52 flow[u][father[u]]-=a[n]; ///更新反向流量 53 flow[father[u]][u]+=a[n]; ///更新正向流量 54 } 55 ans+=a[n]; 56 } 57 } 58 59 int main() 60 { 61 while (~scanf("%d%d",&m,&n)) 62 { 63 memset(cap,0,sizeof(cap)); 64 memset(flow,0,sizeof(flow)); 65 int u,v,w; 66 while (m--) 67 { 68 scanf("%d%d%d",&u,&v,&w); 69 cap[u][v]+=w; 70 } 71 int ans=bfs(); 72 printf("%d\n",ans); 73 } 74 }
以上是关于poj 1273 Drainage Ditches (最大流入门)的主要内容,如果未能解决你的问题,请参考以下文章