图论:Stoer-Wagner算法
利用Stoer-Wagner算法求无向图最小割
直接给出算法描述和过程实现:
算法步骤:
. 设最小割cut=INF, 任选一个点s到集合A中, 定义W(A, p)为A中的所有点到A外一点p的权总和.
. 对刚才选定的s, 更新W(A,p)(该值递增).
. 选出A外一点p, 且W(A,p)最大的作为新的s, 若A!=G(V), 则继续2.
. 把最后进入A的两点记为s和t, 用W(A,t)更新cut.
. 新建顶点u, 边权w(u, v)=w(s, v)+w(t, v), 删除顶点s和t, 以及与它们相连的边.
. 若|V|!=1则继续1.
然后题目POJ2914的意思是去掉一些边使原图变成两个连通分量并且去掉边的权值之和最小,如果要是去掉的边最少的话让所有边权值为1就好了
int n,m;
int v[maxn],d[maxn],vis[maxn];
int G[maxn][maxn];
v表示经过合并之后的节点,d表示w(A,v[i])
然后直接给出实现:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
const int INF=0x7f7f7f7f;
int n,m;
int v[maxn],d[maxn],vis[maxn];
int G[maxn][maxn];
int Stoer_Wagner(int n)
{
int res=INF;
for(int i=;i<n;i++) v[i]=i;//初始化第i个结点就是i
while(n>)
{
int maxp=,prev=;
for(int i=;i<n;i++)
{
//初始化到已圈集合的割大小,并找出最大距离的顶点
d[v[i]]=G[v[]][v[i]];
if(d[v[i]]>d[v[maxp]]) maxp=i;
}
memset(vis,,sizeof(vis));
vis[v[]]=;
for(int i=;i<n;i++)
{
if(i==n-)
{
//只剩最后一个没加入集合的点,更新最小割
res=min(res,d[v[maxp]]);
for(int j=;j<n;j++)
{
//合并最后一个点以及推出它的集合中的点
G[v[prev]][v[j]]+=G[v[j]][v[maxp]];
G[v[j]][v[prev]]=G[v[prev]][v[j]];
}
//第maxp个节点去掉,第n个节点变成第maxp个
v[maxp]=v[--n];
}
vis[v[maxp]]=;
prev=maxp;
maxp=-;
for(int j=;j<n;j++)
//将上次求的maxp加入集合,合并与它相邻的边到割集
if(!vis[v[j]])
{
d[v[j]]+=G[v[prev]][v[j]];
if(maxp==-||d[v[maxp]]<d[v[j]]) maxp=j;
}
}
}
return res;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(G,,sizeof(G));
int x,y,z;
while(m--)
{
scanf("%d%d%d",&x,&y,&z);
G[x][y]+=z;
G[y][x]+=z;
}
printf("%d\n",Stoer_Wagner(n));
}
return ;
}
像这种完全成熟的算法,会用即可,不用再这个的基础上做任何改动
图论:Stoer-Wagner算法的更多相关文章
- POJ 2914 Minimum Cut Stoer Wagner 算法 无向图最小割
POJ 2914 题意:给定一个无向图 小于500节点,和边的权值,求最小的代价将图拆为两个联通分量. Stoer Wagner算法: (1)用类似prim算法的方法求"最大生成树" ...
- 图论(floyd算法):NOI2007 社交网络
[NOI2007] 社交网络 ★★ 输入文件:network1.in 输出文件:network1.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 在社交网络( ...
- 图论之Dijkstra算法
Dijkstra算法是图论中经典的最短路径算法之一,主要用于解决单源最短路径问题. 单源最短路径问题,即求某个源节点到其他各个节点的最短路径. Dijkstra算法采用了贪心算法的思想,如图求1号节点 ...
- 图论(二分图,KM算法):HDU 3488 Tour
Tour Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
- poj Minimum( CutStoer Wagner算法)
Minimum Cut 题目: 给出一张图.要求你删除最小割权和图. 算法分析: //////////////////// 转载 --- ylfdrib ///////////////// ...
- 图论——最短路径 Dijkstra算法、Floyd算法
1.弗洛伊德算法(Floyd) 弗洛伊算法核心就是三重循环,M [ j ] [ k ] 表示从 j 到 k 的路径,而 i 表示当前 j 到 k 可以借助的点:红色部分表示,如果 j 到 i ,i 到 ...
- 图论:Dinic算法
解决最大流问题我搜到了一堆的算法:EK算法.FF算法.Dinic算法.SAP算法.ISAP算法 然而并没有什么鸟用 掌握最常见的Dinic就够了,据说极限优化的ISAP比Dinic更快一些..我当不知 ...
- 图论:Gale-Shapley算法
Gale-Shapley算法又叫做延迟认可算法,它可以解决这么一个问题 一共有N位男士和N位女士 每位男士对每位女士都有一个好感度,让他们结合成为N对夫妻,要求男士优先表白,最后问结合情况 第一轮,每 ...
- 图论:KM算法
如果,将求二分图的最大匹配的所有匹配边的权重看做1 那么用匈牙利算法求二分图的最大匹配的问题也可以看成求二分图的最大权匹配 如果边权是特例,我们就要使用KM算法来做了 这个算法其实还是比较难的,会用就 ...
随机推荐
- 【Consul】Consul架构-Gossip协议
Consul使用gossip协议管理成员关系.广播消息到整个集群.详情可参考Serf library,Serf使用到的gossip协议可以参阅"SWIM: Scalable Weakly-c ...
- 2007: [Noi2010]海拔
2007: [Noi2010]海拔 https://www.lydsy.com/JudgeOnline/problem.php?id=2007 分析: 平面图最小割. S在左下,T在右上,从S到T的一 ...
- Mac OS下搭建Hadoop + Spark集群
首先注意版本兼容问题!!!本文采用的是Scala 2.11.8 + Hadoop 2.7.5 + Spark 2.2.0 请在下载Spark时务必看清对应的Scala和Hadoop版本! 一.配置JD ...
- Log4net 根据日志类别保存到不同的文件,并按照日期生成不同文件名称
<configuration> <configSections> <!--日志记录--> <section name="log4net" ...
- How to add a webpart to your website
I have download a webpart that can play media on the website from the internet.Then how to add ...
- MinGW安装图文教程以及如何配置C语音编程环境
MinGW安装图文教程以及如何配置C语音编程环境 转载自:http://www.jb51.net/softjc/192017.html MinGW 是一组包含文件和端口库,其功能是允许控制台模式的程序 ...
- 「个人训练」Can you solve this equation?(HDU-2199)
题意与分析 纯粹水题.本来想做下放松心情的,结果还是被坑了qaq 重点就是在浮点误差.比较左右的下次就直接上1e-10,别看着题目说1e-4然后给个-5,结果暴wa.气傻了..... 代码 #incl ...
- abs项目 - 战线拉的太长
abs项目 - 战线拉的太长 “从项目中来,到项目中去”. 坑是踩不完的,尽量做到不要踩重复的坑就好. 最近的这个项目,从2016的8月份左右开始立项,一直做到2017的2月份,还是有很多的问题在继续 ...
- Truffle3.0集成NodeJS并完全跑通(附详细实例,可能的错误)
Truffle3.0集成NodeJS并完全跑通(附详细实例,可能的错误) Truffle3.0集成NodeJS并完全跑通(附详细实例,可能的错误) 升级到Truffle3.0 如果之前安装的是Truf ...
- Spring MVC温故而知新 – 参数绑定、转发与重定向、异常处理、拦截器
请求参数绑定 当用户发送请求时,根据Spring MVC的请求处理流程,前端控制器会请求处理器映射器返回一个处理器,然后请求处理器适配器之心相应的处理器,此时处理器映射器会调用Spring Mvc 提 ...