UVALive 5099 Nubulsa Expo(全局最小割)
题面
题解
论文题
见2016绍兴一中王文涛国家队候选队员论文《浅谈无向图最小割问题的一些算法及应用》4节
全局最小割 板题
CODE
暴力
用堆优化可以做到
这里只写了暴力
#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);
}
}