UVALive 5099 Nubulsa Expo(全局最小割)

題面

vjudge傳送門

題解

論文題

見2016紹興一中王文濤國家隊候選隊員論文《淺談無向圖最小割問題的一些算法及應用》4節

全局最小割 板題

CODE

暴力O(n3)O(n^3)
用堆優化可以做到O(nmlog)O(nmlog)
這裏只寫了暴力

#include <bits/stdc++.h>
using namespace std;
template<class T>inline void read(T &x) {
	char ch; while(!isdigit(ch=getchar()));
	for(x=ch-'0';isdigit(ch=getchar());x=x*10+ch-'0');
}
typedef long long LL;
const int MAXN = 305;
LL c[MAXN][MAXN], sum[MAXN];
int n, m, s;
bool del[MAXN], inq[MAXN];
void merge(int u, int v) {
	for(int i = 1; i <= n; ++i)
		c[u][i] += c[v][i], c[i][u] += c[i][v];
	del[v] = 1;
}
LL solve(int N) {
	for(int i = 1; i <= n; ++i) sum[i] = inq[i] = 0;
	int u=0, v=0;
	for(int i = 1; i <= n; ++i) if(!del[i]) { v = i; break; }
	while(--N) {
		inq[u=v] = 1; v=0;
		for(int i = 1; i <= n; ++i) if(!del[i] && !inq[i]) sum[i] += c[u][i];
		for(int i = 1; i <= n; ++i) if(!del[i] && !inq[i] && sum[i] > sum[v]) v = i;
	}
	merge(u, v);
	return sum[v];
}
int main () {
	while(read(n), read(m), read(s), n&&m&&s) {
		memset(del, 0, sizeof del);
		for(int i = 1, x, y, z; i <= m; ++i)
			read(x), read(y), read(z), c[x][y] += z, c[y][x] += z;
		LL ans = 1ll<<50;
		for(int i = n; i > 1; --i) ans = min(ans, solve(i));
		printf("%lld\n", ans);
	}
}
發佈了373 篇原創文章 · 獲贊 241 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章