思路:
在输出最大流的流量的基础上再输出最终残余网络中从源点可达的点即可。使用了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 }