1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 #include <iostream> 5 using namespace std; 6 typedef long long LL; 7 8 const int MAXN = 310; 9 10 LL mat[MAXN][MAXN]; 11 LL weight[MAXN]; 12 bool del[MAXN], vis[MAXN];; 13 int n, m, st; 14 15 void init() { 16 memset(mat, 0, sizeof(mat)); 17 memset(del, 0, sizeof(del)); 18 } 19 20 LL StoerWagner(int &s, int &t, int cnt) { 21 memset(weight, 0, sizeof(weight)); 22 memset(vis, 0, sizeof(vis)); 23 for(int i = 1; i <= n; ++i) 24 if(!del[i]) {t = i; break; } 25 while(--cnt) { 26 vis[s = t] = true; 27 for(int i = 1; i <= n; ++i) if(!del[i] && !vis[i]) { 28 weight[i] += mat[s][i]; 29 } 30 t = 0; 31 for(int i = 1; i <= n; ++i) if(!del[i] && !vis[i]) { 32 if(weight[i] >= weight[t]) t = i; 33 } 34 } 35 return weight[t]; 36 } 37 38 void merge(int s, int t) { 39 for(int i = 1; i <= n; ++i) { 40 mat[s][i] += mat[t][i]; 41 mat[i][s] += mat[i][t]; 42 } 43 del[t] = true; 44 } 45 46 LL solve() { 47 LL ret = -1; 48 int s, t; 49 for(int i = n; i > 1; --i) { 50 if(ret == -1) ret = StoerWagner(s, t, i); 51 else ret = min(ret, StoerWagner(s, t, i)); 52 merge(s, t); 53 } 54 return ret; 55 } 56 57 int main() { 58 while(scanf("%d%d%d", &n, &m, &st) != EOF) { 59 if(n == 0 && m == 0 && st == 0) break; 60 init(); 61 while(m--) { 62 int x, y, z; 63 scanf("%d%d%d", &x, &y, &z); 64 mat[x][y] += z; 65 mat[y][x] += z; 66 } 67 cout<<solve()<<endl; 68 } 69 }
HDU 3691 Nubulsa Expo(全局最小割Stoer-Wagner算法),布布扣,bubuko.com
HDU 3691 Nubulsa Expo(全局最小割Stoer-Wagner算法)
原文:http://www.cnblogs.com/oyking/p/3604161.html