码迷,mamicode.com
首页 > 其他好文 > 详细

UVALive 5099 Nubulsa Expo 全局最小割 非网络流 n^3

时间:2014-11-11 00:54:55      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:blog   http   io   ar   sp   for   on   2014   log   

题目链接:点击打开链接

题意:

给定n个点m条无向边 源点S

下面m行给出无向边以及边的容量。

问:

找一个汇点,使得图的最大流最小。

输出最小的流量。

思路:

最大流=最小割。

所以题意就是找全局最小割。

和源点无关,因为不关心源点在哪个点集里。

模版题: O(n^3)

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 305;
const ll maxw = 1000007;
const ll inf = 1e17;
ll g[N][N], w[N];
int a[N], v[N], na[N];
ll mincut(int n) {
	int i, j, pv, zj;
	ll best = inf;
	for(i = 0; i < n; i ++) v[i] = i;
		
	while(n > 1) {
		for(a[v[0]] = 1, i = 1; i < n; i ++) {
			a[v[i]] = 0;
			na[i-1] = i;
			w[i] = g[v[0]][v[i]];
		}
		for(pv = v[0], i = 1; i < n; i ++) {
			for(zj = -1, j = 1; j < n; j ++)
				if(!a[v[j]] && (zj < 0 || w[j] > w[zj])) zj = j;
				
			a[v[zj]] = 1;
			if(i == n-1) {
				if(best > w[zj]) best = w[zj];
				for(i = 0; i < n; i ++) {
					g[v[i]][pv] = g[pv][v[i]] += g[v[zj]][v[i]];
				}
				v[zj] = v[--n];
				break;
			}
			pv = v[zj];
			for(j = 1; j < n; j ++) if(!a[v[j]])
				w[j] += g[v[zj]][v[j]];
		}
	}
	return best;
}
int main() {
	int n, m, K, u, v ,w;
	while(~scanf("%d%d%d", &n, &m, &K)) {
		if(n == 0) break;
		for(int i = 0; i < n; i ++) {
			for(int j = 0; j < n; j ++) {
				g[i][j] = g[j][i] = 0;
			}
		}
		for(int i = 0; i < m; i ++) {
			scanf("%d%d%d", &u, &v, &w);
			u--; v --;
			g[u][v] += w;
			g[v][u] += w;
		}
		printf("%lld\n", mincut(n));
	}
	return 0;
}


UVALive 5099 Nubulsa Expo 全局最小割 非网络流 n^3

标签:blog   http   io   ar   sp   for   on   2014   log   

原文地址:http://blog.csdn.net/qq574857122/article/details/40992583

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!