POJ2914 Minimum Cut(全局最小割Stoer_Wagner算法:模板)

全局最小割,这里有篇讲得很好的论文:

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 }
POJ2914

 

转载于:https://www.cnblogs.com/wangsouc/articles/3357831.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值