hihocoder1378 网络流二·最大流最小割定理

思路:

在输出最大流的流量的基础上再输出最终残余网络中从源点可达的点即可。使用了EK算法。

实现:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int INF = 0x3f3f3f3f;
 5 const int N = 505;
 6 
 7 int n, m;
 8 int G[N][N], pre[N];
 9 bool vis[N];
10 
11 int augment(int s, int t)
12 {
13     queue<int> q;
14     q.push(s);
15     memset(pre, 0, sizeof(pre));
16     memset(vis, 0, sizeof(vis));
17     vis[s] = true;
18     bool flg = false;
19     while (!q.empty())
20     {
21         int tmp = q.front(); q.pop();
22         for (int i = 1; i <= n; i++)
23         {
24             if (G[tmp][i] && !vis[i])
25             {
26                 pre[i] = tmp;
27                 vis[i] = true;
28                 if (i == t) { flg = true; break; }
29                 else q.push(i);
30             }
31         }
32         if (flg) break;
33     }
34     if (!flg) return 0;
35     int now = t;
36     int minn = INF;
37     while (pre[now])
38     {
39         minn = min(minn, G[pre[now]][now]);
40         now = pre[now];
41     }
42     now = t;
43     while (pre[now])
44     {
45         G[pre[now]][now] -= minn;
46         G[now][pre[now]] += minn;
47         now = pre[now];
48     }
49     return minn;
50 }
51 int main()
52 {
53     while (cin >> n >> m)
54     {
55         memset(G, 0, sizeof(G));
56         int a, b, c;
57         for (int i = 0; i < m; i++)
58         {
59             cin >> a >> b >> c;
60             G[a][b] += c;
61         }
62         int ans = 0;
63         int res = augment(1, n);
64         while (res)
65         {
66             ans += res;
67             res = augment(1, n);
68         }
69         cout << ans << " ";
70         int cnt = 0;
71         for (int i = 1; i <= n; i++)
72         {
73             if (vis[i]) cnt++;
74         }
75         cout << cnt << endl;
76         for (int i = 1; i <= n; i++)
77         {
78             if (vis[i]) cout << i << " ";
79         }
80         cout << endl;
81     }
82     return 0;
83 }
原文地址:https://www.cnblogs.com/wangyiming/p/9878018.html