poj 2914 Minimum Cut 无向图最小边割

题意:

求无向图的全局最小边割。

分析:

stoer-wagner模板。

代码:

//poj 2914
//sep9
#include <iostream>
using namespace std;
const int maxN=512;
int g[maxN][maxN];
int b[maxN],dist[maxN];
int n,m;

int Min_Cut_Phase(int ph,int &x,int &y)
{
	int i,j,t;
	t=1;
	b[1]=ph;
	for(i=1;i<=n;++i)
		if(b[i]!=ph) dist[i]=g[1][i];
	for(i=1;i<n;++i){
		x=t;
		for(t=0,j=1;j<=n;++j)
			if(b[j]!=ph&&(!t||dist[j]>dist[t]))
				t=j;
		b[t]=ph;
		for(j=1;j<=n;++j)
			if(b[j]!=ph) dist[j]+=g[t][j];
	}
	return y=t,dist[t];
}

void Merge(int x,int y)
{
	int i;
	if(x>y) swap(x,y);
	for(i=1;i<=n;++i)
		if(i!=x&&i!=y)
			g[i][x]+=g[i][y],g[x][i]+=g[y][i];
	if(y==n)
		return ;
	for(i=1;i<n;++i) if(i!=y){
		swap(g[i][y],g[i][n]);
		swap(g[y][i],g[n][i]);
	}
	return ;
}

int main()
{
	while(scanf("%d%d",&n,&m)==2){
		memset(g,0,sizeof(g));
		while(m--){
			int a,b,c;
			scanf("%d%d%d",&a,&b,&c);
			++a,++b;
			g[a][b]+=c;
			g[b][a]+=c;
		}
		int ret=INT_MAX,i,x,y;
		memset(b,0,sizeof(b));
		for(i=1;n>1;++i,--n){
			ret=min(ret,Min_Cut_Phase(i,x,y));
			Merge(x,y);
		}
		printf("%d\n",ret);
	}
	return 0;
} 
时间: 2024-12-25 17:38:31

poj 2914 Minimum Cut 无向图最小边割的相关文章

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的最

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&

POJ 2914 Minimum Cut 最小割算法题解

最标准的最小割算法应用题目. 核心思想就是缩边:先缩小最大的边,然后缩小次大的边,依此缩小 基础算法:Prime最小生成树算法 不过本题测试的数据好像怪怪的,同样的算法时间运行会差别很大,而且一样的代码替换,居然会WA.系统出错的几率很小,难倒测试系统本题会有错误? 懒得继续测试这道题的系统了,反正算法正确,AC. #include <stdio.h> #include <string.h> #include <limits.h> const int MAX_N = 5

POJ 2914 Minimum Cut 最小割图论

Description Given an undirected graph, in which two vertices can be connected by multiple edges, what is the size of the minimum cut of the graph? i.e. how many edges must be removed at least to disconnect the graph into two subgraphs? Input Input co

POJ 2914 Minimum Cut

无向图最小割,Stoer Wanger算法.先找了个模板,日后再学习吧... #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define MAXN 555 #define inf 1<<30 int v[MAXN],dist[MAXN]; int map[MAXN][MAXN]; bool vis[MA

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 2516 Minimum Cost (最小费用最大流)

POJ 2516 Minimum Cost 链接:http://poj.org/problem?id=2516 题意:有M个仓库,N个商人,K种物品.先输入N,M,K.然后输入N行K个数,每一行代表一个商人要购买的物品,其中K个数分别表示要购买的每件商品数.然后是M行K个数,每行表示仓库里的情况,其中K个数分别每种物品的库存量.接下来是K个矩阵,每个矩阵为N*M,分别表示第K种物品从M个仓库运到第N个商人的花费.问能否合理安排,使得花费最少,如果不行就输出-1. 思路: 一开始的时候,竟然构造了

poj 2516 Minimum Cost 【最小费用最大流】

题目:poj 2516 Minimum Cost 题意:有 n 个商店,k种物品和 m 个供货商,让你求进满足商店需求的货物的最小花费? 有必要说一下输入数据. 首先n ,k ,m 然后是一个n*m的矩阵,n个商店对每种货物的需求,表示第 i 个商店需要第 j 种货物 x个 然后是m * k 的矩阵,m个供货商可以供k种货物的数量,表示第 i 个供货商 提供第 j 中货物 x 个 接下来是 k 个 n * m 的矩阵,表示第 i 个货物,由 k 供应商发货给 j 商店的价格x (注意如果供不应求

POJ 2516 Minimum Cost(最小费用最大流啊)

题目链接:http://poj.org/problem?id=2516 Description Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his sale area there are N shopkeepers (marked from 1 to N) which stocks goods from him.Dearboy has M supply places (mar