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

题目链接:点击打开链接

题意:

给定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;
}
时间: 2024-12-22 09:28:59

UVALive 5099 Nubulsa Expo 全局最小割 非网络流 n^3的相关文章

POJ 2914 Minimum Cut (全局最小割)

[题目链接] http://poj.org/problem?id=2914 [题目大意] 求出一个最小边割集,使得图不连通 [题解] 利用stoerwagner算法直接求出全局最小割,即答案. [代码(递归)] #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int INF=0x3f3f3f3f; const int MAX_N=510; int v

POJ 2914 - Minimum Cut - 全局最小割,Stoer-Wagner算法

题目大意:给定一个N个点.M条边的无向带权图,边的权值均为正整数.若要使它变成非连通图,需要移除的边总权值最小是多少? N≤500,图中不存在自环,但可能有重边(这里题意没交代清楚). Stoer-Wagner算法裸题.英文维基:https://en.wikipedia.org/wiki/Stoer%E2%80%93Wagner_algorithm 该算法的思想之一是:对于一个无向连通图,选定某两点s,t,以及该图的一个s-t割C,则"C是该图的全局最小割"是"C是s-t的最

POJ2914 Minimum Cut【全局最小割】【Stoer-Wangner】

题目链接: http://poj.org/problem?id=2914 题目大意: 提一个无向有重边的图,有重边的边权累加起来,求全局最小割. 思路: 一个无向连通图,去掉一个边集可以使其变成两个连通分量则这个边集就是割集.最小割 集当然就是权和最小的割集. 这是一个最简单的全局最小割模板题.直接套上模板就可以了.来说说Stoer-Wangner算 法吧. Stoer-Wangner算法: 对于图中的任意两个顶点u和v,若u,v属于最小割的同一个集合中,那么僵顶点u和顶点 v合并后并不影响图的

POJ 2914 Minimum Cut 全局最小割

裸的全局最小割了吧 有重边,用邻接矩阵的时候要小心 #include<iostream> #include<cstdio> #include<bitset> #include<cstring> #define MOD 1000000007 #define maxn 509 using namespace std; int a[590][590],wage[maxn],in[maxn],vis[maxn]; int n,x,y,v; int find(int&

全局最小割 学习总结

全局最小割的意思是在一个无向图中任取S和T,求最小割的最小值 还有一种描述是删掉无向图中的边使得其不连通的最小代价 当然,这种题目可以用分治+最小割来求解 但是时间复杂度大约在O(n^4)左右 有一种更好的求解方法可以在O(n^3)的时间复杂度内求解 做法是这样的: 首先对于图中任意两点S->T 要么S和T不在一个集合里时是答案,答案显然是S和T的最小割 否则S和T在一个集合里,我们可以将S和T缩成一个点,不难证明这样是等效的 我们模拟这个过程,每次任取S和T跑最小割,时间复杂度大概跟分治+最小

图的全局最小割的Stoer-Wagner算法及例题

Stoer-Wagner算法基本思想:如果能求出图中某两个顶点之间的最小割,更新答案后合并这两个顶点继续求最小割,到最后就得到答案. 算法步骤: ------------------------------------------------------------------------------------------------------------------------- (1)首先初始化,设最小割ans = INF                                

UVALive 7264 Kejin Game(最小割)

题目地址:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5276 思路:最小割.将每个点拆成 i 和 i',设一个源点与汇点. 1.对于边i--->j,连边i'--->j,容量为对应边的费用. 2.源点到 i 连边,容量为满足条件后购买 i 的费用. 3.对于 i 和 i' 连边,容量为直接购买 i 的费用. 4

POJ2914 Minimum Cut 【全局最小割】(Stoer_Wagner)

Minimum Cut Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 7610   Accepted: 3203 Case Time Limit: 5000MS Description Given an undirected graph, in which two vertices can be connected by multiple edges, what is the size of the minimum c

全局最小割

stoer-Wagner算法 进行n轮操作,每轮操作确定一对点s,t被割开情况下的最小割,然后将s,t合并.s,t为操作中最后剩下的两个点. 操作类似prim求最大生成树,每次将与当前集合相邻的距离最大的点合并到集合中,最后剩下s,t两点. 代码来自wiki,可以堆优化 const int maxn = 550; const int inf = 1000000000; int n, r; int edge[maxn][maxn], dist[maxn]; bool vis[maxn], bin[