UVALive 5099 Nubulsa Expo(全局最小割)

题面

vjudge传送门

题解

论文题

见2016绍兴一中王文涛国家队候选队员论文《浅谈无向图最小割问题的一些算法及应用》4节

全局最小割 板题

CODE

暴力 O ( n 3 ) O(n^3)
用堆优化可以做到 O ( n m l o g ) 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);
	}
}
发布了367 篇原创文章 · 获赞 239 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/Ike940067893/article/details/103326956
今日推荐