POJ 1273 Drainage Ditches
题意:从池塘1-m有n条水渠,求出最大流量
题解:经典最大流问题,使用最短增广路算法Edmonds Karp,每次通过bfs寻找増广路径,最坏时间复杂度为O(n*m^2),n是点数 m是边数。
1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 using namespace std; 5 6 const int inf=0x3f3f3f3f; 7 int g[310][310],pre[310],vis[310]; 8 int n,m; 9 int edmonds_karp() 10 { 11 int v; 12 deque<int> q; 13 memset(pre,0,sizeof(pre)); 14 memset(vis,0,sizeof(vis)); 15 vis[1]=1; 16 q.push_back(1); 17 bool find=0; 18 while(!q.empty()) 19 { 20 v=q.front(); 21 q.pop_front(); 22 for(int i=1;i<=m;i++) 23 { 24 if(g[v][i]>0&&vis[i]==0) 25 { 26 pre[i]=v; 27 vis[i]=1; 28 if(i==m) 29 { 30 find=1; 31 q.clear(); 32 break; 33 } 34 else 35 q.push_back(i); 36 } 37 } 38 } 39 if(!find) 40 return 0; 41 int minf=inf; 42 v=m; 43 while(pre[v]) 44 { 45 minf=min(minf,g[pre[v]][v]); 46 v=pre[v]; 47 } 48 v=m; 49 while(pre[v]) 50 { 51 g[pre[v]][v]-=minf; 52 g[v][pre[v]]+=minf; 53 v=pre[v]; 54 } 55 return minf; 56 } 57 int main() 58 { 59 while(~scanf("%d%d",&n,&m)) 60 { 61 int s,e,c; 62 memset(g,0,sizeof(g)); 63 for(int i=0;i<n;i++) 64 { 65 scanf("%d%d%d",&s,&e,&c); 66 g[s][e]+=c; 67 } 68 int maxf=0; 69 int aug; 70 while(aug=edmonds_karp()) 71 maxf+=aug; 72 printf("%d\n",maxf); 73 } 74 }