首页 > 代码库 > HDU 1532 Drainage Ditches(最大流 EK算法)

HDU 1532 Drainage Ditches(最大流 EK算法)

题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1532

思路:

网络流最大流的入门题,直接套模板即可~ 注意坑点是:有重边!!读数据的时候要用“+=”替换“=”。

对网络流不熟悉的,给一篇讲解:http://www.cnblogs.com/ZJUT-jiangnan/p/3632525.html。 ?(? ? ??)我是看这篇博客才入门的。

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <queue>
 4 #include <algorithm>
 5 using namespace std;
 6 const int inf=10000005;
 7 int n,m;
 8 int mp[205][205];
 9 int vis[205];
10 int pre[205];
11 void update(int s,int t,int Min){
12     int k=t;
13     while (pre[k]!=-1) {
14         mp[k][pre[k]]+=Min;
15         mp[pre[k]][k]-=Min;
16         k=pre[k];
17     }
18 }
19 int bfs(int s,int t){
20     int Min=inf;
21     memset(vis, 0, sizeof(vis));
22     memset(pre, -1, sizeof(pre));
23     queue<int>q;
24     q.push(s);
25     vis[s]=1;
26     while (!q.empty()) {
27         int x=q.front();q.pop();
28         for (int i=1; i<=n; i++) {
29             if (!vis[i] && mp[x][i]>0) {
30                 pre[i]=x;
31                 Min=min(mp[x][i], Min);
32                 q.push(i);
33                 vis[i]=1;
34             }
35         }
36         if(pre[t]!=-1)  return Min;
37     }
38     return 0;
39 }
40 int edmonds_karp(int s,int t){
41     int Min=-1;
42     int Max=0;
43     while(Min!=0){
44         Min=bfs(s, t);
45         update(s,t,Min);
46         Max+=Min;
47     }
48     return Max;
49 }
50 int main(){
51     while (scanf("%d%d",&n,&m)!=EOF) {
52         memset(mp, 0, sizeof(mp));
53         for (int i=0; i<n; i++) {
54             int x,y,z;
55             scanf("%d%d%d",&x,&y,&z);
56             mp[x][y]+=z;//注意!!
57         }
58         printf("%d\n",edmonds_karp(1, m));
59     }
60     return 0;
61 }

 

HDU 1532 Drainage Ditches(最大流 EK算法)