全局最小割,这里有篇讲得很好的论文:
http://www.cnblogs.com/ylfdrib/archive/2010/08/17/1801784.html
1 #include<algorithm> 2 #include<stdio.h> 3 #include<string.h> 4 using namespace std; 5 const int maxn = 1010; 6 /* 7 Stoer-Wagner算法:全局最小割 8 复杂度:N^2 9 邻接矩阵 10 */ 11 int dis[maxn]; 12 int node[maxn]; 13 bool vis[maxn]; 14 int map[maxn][maxn]; 15 int n; 16 int Stoer_Wagner() 17 { 18 memset(vis,0,sizeof(vis)); 19 memset(dis,0,sizeof(dis)); 20 int ans = 0x3f3f3f3f; 21 for (int i=0;i<n;i++){ 22 node[i] = i; 23 } 24 while (n>1){ 25 int m = -1; 26 int maxj = 1; 27 for (int i=1;i<n;i++){ 28 dis[node[i]] = map[node[0]][node[i]]; 29 vis[node[i]] = 0; 30 if (dis[node[i]] > m){ 31 m = dis[node[i]]; 32 maxj = i; 33 } 34 } 35 int pre = 0; 36 vis[node[0]] = 1; 37 for (int j=1;j<n;j++){ 38 vis[node[maxj]] = 1; 39 if (j == n-1){ 40 ans = min(ans, m); 41 for (int i=0;i<n;i++){ 42 map[node[pre]][node[i]] += map[node[maxj]][node[i]]; 43 map[node[i]][node[pre]] += map[node[maxj]][node[i]]; 44 } 45 node[maxj] = node[--n]; 46 }else{ 47 pre = maxj; 48 m = -1; 49 for (int i=1;i<n;i++){ 50 if (! vis[node[i]]){ 51 dis[node[i]] += map[node[pre]][node[i]]; 52 if (dis[node[i]] > m){ 53 m = dis[node[i]]; 54 maxj = i; 55 } 56 } 57 } 58 } 59 } 60 } 61 return ans; 62 } 63 int m; 64 int main() 65 { 66 while (scanf("%d%d", &n, &m)==2){ 67 memset(map,0,sizeof(map)); 68 while (m--){ 69 int u,v,val; 70 scanf("%d%d%d", &u, &v, &val); 71 map[u][v] += val; 72 map[v][u] += val; 73 } 74 printf("%d\n",Stoer_Wagner()); 75 } 76 return 0; 77 }