求全局最小割(SW算法)
King of Destruction
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1022 Accepted Submission(s): 400
is to destroy the wooden plank between some wooden pegs,in order to cut these wooden pegs into two disconnected parts,and destroy each piece of plank need consume different energy.However Zhou xingxing is beginner after all,so he is turn to you for help,please
calculate the minimum energy he need to destroy the wooden plank.
Each test case starts with two integers n (0 < n <= 100) and m in one line, where n、m are the number of wooden pegs and wooden plank.
Following are m lines, each line contains three integers s, e and q (0 <= s, e < n,q > 0), meaning that there need q energy to destroy the wooden plank between s and e.
2 1
0 1 50
3 2
0 1 50
1 2 10
50
10
题意:求无向图的最小割。思路:无向图的最小割又叫全局最小割,枚举汇点求最大流效率很低,因而普遍使用StoerWagner算法,时间复杂度为O(n^3)。程序:#include"stdio.h"
#include"string.h"
#define inf 99999999
int G[666][666],ans;
int min(int a,int b)
{
return a<b?a:b;
}
int f[666];
int finde(int x)
{
if(x!=f[x])
f[x]=finde(f[x]);
return f[x];
}
void make(int a,int b)
{
int x=finde(a);
int y=finde(b);
if(x!=y)
f[x]=y;
}
void Mincut(int n)
{
ans=inf;
int node[666],dis[666];
bool use[666];
int i,k,pre;
for(i=0;i<n;i++)
node[i]=i;
while(n>1)
{
int maxj=1;
for(i=1;i<n;i++)//初始化到已圈集合的割大小
{
dis[node[i]]=G[node[i]][node[0]];
if(dis[node[maxj]]<dis[node[i]])
{
maxj=i;
}
}
pre=0;
memset(use,false,sizeof(use));
use[node[0]]=true;
for(k=1;k<n;k++)
{
if(k==n-1)//只剩最后一个没加入集合的点,更新最小割
{
ans=min(ans,dis[node[maxj]]);
for(i=0;i<n;i++)//合并最后一个点以及推出它的集合中的点
{
G[node[i]][node[pre]]=G[node[pre]][node[i]]+=G[node[i]][node[maxj]];
}
node[maxj]=node[--n];//缩点后的图
}
use[node[maxj]]=true;
pre=maxj;
maxj=-1;
for(i=1;i<n;i++)
{
if(!use[node[i]])
{
dis[node[i]]+=G[node[i]][node[pre]];//将上次求的maxj加入集合,合并与它相邻的边到割集
if(maxj==-1||dis[node[maxj]]<dis[node[i]])
maxj=i;
}
}
}
}
}
int main()
{
int n,m,i;
while(scanf("%d%d",&n,&m)!=-1)
{
memset(G,0,sizeof(G));
for(i=0;i<n;i++)
{
f[i]=i;
}
while(m--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
G[a][b]=G[b][a]+=c;
make(a,b);
}
int flag=0;
for(i=0;i<n;i++)
{
if(finde(i)!=finde(0))
flag++;
}
if(flag)
printf("0\n");
else
{
Mincut(n);
printf("%d\n",ans);
} }
}
求全局最小割(SW算法)的更多相关文章
- SW算法求全局最小割(Stoer-Wagner算法)
我找到的唯一能看懂的题解:[ZZ]最小割集Stoer-Wagner算法 似乎是一个冷门算法,连oi-wiki上都没有,不过洛谷上竟然有它的模板题,并且2017百度之星的资格赛还考到了.于是来学习一下. ...
- poj 2914(stoer_wanger算法求全局最小割)
题目链接:http://poj.org/problem?id=2914 思路:算法基于这样一个定理:对于任意s, t V ∈ ,全局最小割或者等于原图的s-t 最小割,或者等于将原图进行 Cont ...
- HDU 3691 Nubulsa Expo(全局最小割Stoer-Wagner算法)
Problem Description You may not hear about Nubulsa, an island country on the Pacific Ocean. Nubulsa ...
- HDU 6081 度度熊的王国战略(全局最小割Stoer-Wagner算法)
Problem Description 度度熊国王率领着喵哈哈族的勇士,准备进攻哗啦啦族. 哗啦啦族是一个强悍的民族,里面有充满智慧的谋士,拥有无穷力量的战士. 所以这一场战争,将会十分艰难. 为了更 ...
- 全局最小割StoerWagner算法详解
前言 StoerWagner算法是一个找出无向图全局最小割的算法,本文需要读者有一定的图论基础. 本文大部分内容与词汇来自参考文献(英文,需***),用兴趣的可以去读一下文献. 概念 无向图的割:有无 ...
- 全局最小割Stoer-Wagner算法
借鉴:http://blog.kongfy.com/2015/02/kargermincut/ 提到无向图的最小割问题,首先想到的就是Ford-Fulkerson算法解s-t最小割,通过Edmonds ...
- POJ 2914:Minimum Cut(全局最小割Stoer-Wagner算法)
http://poj.org/problem?id=2914 题意:给出n个点m条边,可能有重边,问全局的最小割是多少. 思路:一开始以为用最大流算法跑一下,然后就超时了.后来学习了一下这个算法,是个 ...
- [全局最小割][Stoer-Wagner 算法] 无向图最小割
带有图片例子的 [BLOG] 复杂度是$(n ^ 3)$ HDU3691 // #pragma GCC optimize(2) // #pragma GCC optimize(3) // #pragm ...
- poj 2914&&hdu 3002 全局最小割Stoer-Wagner算法模板
#include<stdio.h> #include<string.h> #include<iostream> #define inf 0x3fffffff #de ...
随机推荐
- 统一建模语言 UML
目录 统一建模语言 UML UML定义了5类10种模型图 一用例图用于建立需求模型 二静态图主要描述系统的静态表示和关系包括类图包图对象图 三行为图描述系统动态模型和对象组成的交换关系包括状态图和活动 ...
- thinkphp 使用原生mysql语句 联合查询
<?php class DelAction extends Action { public function ml(){ // 实例化一个空模型,没有对应任何数据表 $Dao = M(); // ...
- netsnmp编译动态库
.编译动态库 将写完的snmp代理程序编译生成动态库 gcc -c -fpic telnetConfig.c -o telnetConfig.o -I/usr/local/net-snmp/inclu ...
- static、extern分析
1.extern extern在变量声明中有这样一个作用:你要在demo2.cpp中引用demo1.cpp中的一个全局变量,就要在demo2.h中用extern来声明这个全局变量(或者在demo1.h ...
- linux -- 进程管理和作业控制
一. 作业控制 1. 直接将命令放到后台"执行": & [root @test /root ]# command & 范例: [root @test /root] ...
- js身份证验证类
var IDCard = function () { //---------------------------------------------------------- // 功能:根据身份证号 ...
- MVC下载远程文件流(WebClient)
public ActionResult DownLoad_File() { return File(ScLiu(PathUrl), "application/octet-stream&quo ...
- php将汉字转换为拼音和得到词语首字母(一)
<?php /** * 修复二分法查找方法 * 汉字拼音首字母工具类 * 注: 英文的字串:不变返回(包括数字) eg .abc123 => abc123 * 中文字符串:返回拼音首字符 ...
- POI-根据Cell获取对应的String类型值
/** * 根据不同情况获取Java类型值 * <ul><li>空白类型<ul><li>返回空字符串</li></ul>< ...
- squid2.7安装与配置
CleverCode近期研究了一下squid的安装与配置. 如今总结一下.分享给大家. 1 简单介绍 代理server英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息. Squ ...