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
",maxf);
73     }
74 }
原文地址:https://www.cnblogs.com/kearon/p/7674634.html