Stoer-Wagner 全局最小割代码

还是很好背的。

#include<bits/stdc++.h>
using namespace std;
const int N = 623, inf = 0x3f3f3f3f;

int n,m,dis[N][N];
int s, t;
int ord[N], w[N];
bool deld[N], vis[N];

int proc(int x) {
	memset(vis, 0, sizeof vis);
	memset(w, 0, sizeof w);
	for(int i=1; i<=n-x+1; ++i) {
		int mx = 0;
		for(int j=1; j<=n; ++j)
			if(!deld[j] && !vis[j] && (!mx || w[j]>w[mx])) mx=j;
		vis[mx]=true, ord[i]=mx;
		for(int j=1; j<=n; ++j)
			if(!deld[j] && !vis[j]) w[j] += dis[mx][j];
	}
	s = ord[n-x], t = ord[n-x+1];
	return w[t];
}

int sw() {
	int res = inf;
	for(int i=1; i<n; ++i) {
		res = min(res, proc(i));
		deld[t] = true;
		for(int j=1; j<=n; ++j) {
			dis[s][j] += dis[t][j], dis[j][s] += dis[j][t];
		}
	}
	return res;
}

int main() {
	scanf("%d%d", &n, &m);
	for(int i=0; i<m; ++i) {int x,y,z;
		scanf("%d%d%d", &x, &y, &z);
		dis[x][y]+=z, dis[y][x]+=z;
	}
	cout << sw();
	return 0;
}
posted @ 2021-01-08 16:48  xwmwr  阅读(87)  评论(0编辑  收藏  举报