POJ 2914 Minimun Cut (Stoer-Wagner, 无向图最小割)

来源:互联网 发布:圣诞玫瑰结局真相知乎 编辑:程序博客网 时间:2024/06/06 02:38
#include <iostream>#include <cstdio>#include <cstring>#include <vector>using namespace std;#define N 520#define LL long longLL a[N][N];int n, m;bool vis[N];LL d[N];int q[N], qt;bool c[N];int pre[N];void prim(int k) {qt = 0;memset(d, 0, sizeof d);memset(c, 0, sizeof c);c[1] = 1;q[++qt] = 1;for(int i = 2; i <= n; ++i) {if(vis[i]) continue;d[i] = a[1][i];pre[i] = 1;}for(int i = 2; i <= k; ++i) {int u = -1;for(int j = 1; j <= n; ++j) {if(vis[j] || c[j]) continue;if(u == -1 || d[j] > d[u]) u = j;}c[u] = 1;q[++qt] = u;for(int j = 1; j <= n; ++j) {if(vis[j] || c[j]) continue;if(a[u][j] > d[j]) {d[j] = a[u][j];pre[j] = u;}}}}int main() {//get_data();//freopen("tt.txt", "r", stdin);//freopen("out1.txt", "w", stdout);int kk = 0;while(scanf("%d%d", &n, &m) != EOF) {memset(a, 0, sizeof a);for(int i = 1; i <= m; ++i) {int u, v, c;scanf("%d%d%d", &u, &v, &c);++u, ++v;a[u][v] += c;a[v][u] += c;}memset(vis, 0, sizeof vis);LL ans = ~0ULL >> 1;for(int i = 1; i < n; ++i) {prim(n - i + 1);int x = q[n - i + 1];int y = pre[x];LL tmp = 0;for(int j = 1; j <= n; ++j) {if(vis[j]) continue;if(j == x) continue;tmp += a[j][x];}ans = min(ans, tmp);if(x > y) swap(x, y);vis[y] = 1;for(int j = 1; j <= n; ++j) {if(vis[j] || j == x) continue;a[j][x] += a[j][y];a[x][j] = a[j][x];}}printf("%I64d\n", ans);}return 0;}

0 0
原创粉丝点击