图论: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算法来做了 这个算法其实还是比较难的,会用就 ...
随机推荐
- P1823 音乐会的等待(单调栈)
P1823 音乐会的等待 题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么 ...
- 使用postgresql作为cm的数据库时候添加报错
如下图,当postgresql安装成功,建立好数据库scm,rman,amon之后,添加cm对应服务报错hadoopNode2没有相应数据库: No database server found run ...
- Kotlin怎样使用Android的Dagger2
作者:Antonio Leiva 时间:Apr 11, 2017 原文链接:https://antonioleiva.com/dagger-android-kotlin/ 在Android上,创建去耦 ...
- 关键词提取TF-IDF算法/关键字提取之TF-IDF算法
TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与信息探勘的常用加权技术.TF的意思是词频(Term - frequency), ...
- Queue模块初识
Queue模块实现了多生产者.多消费者队列.它特别适用于信息必须在多个线程间安全地交换的多线程程序中.这个模块中的Queue类实现了所有必须的锁语义.它依赖于Python中线程支持的可用性:参见thr ...
- centos7.4内核从3.10升级到4.14详细步骤
由于我们的docker学习中的Overlay需要内核版本在3.12+,所以在安装完centos7.4之后要进行内核升级,下面是升级步骤:1.导入keyrpm --import https://www. ...
- 最短路径——Bellman-Ford算法以及SPFA算法
说完dijkstra算法,有提到过朴素dij算法无法处理负权边的情况,这里就需要用到Bellman-Ford算法,抛弃贪心的想法,牺牲时间的基础上,换取负权有向图的处理正确. 单源最短路径 Bellm ...
- Beat 冲刺 (3/7)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 1.界面的修改与完善 展示GitHub当日代码/文档签入记 ...
- UITableView性能优化【本文摘自智车芯官网】
UITableView是个表格视图,可以在表格行空间中添加多个子控件,UITableView继承了UIScrollView,默认状态下可以堆单元格进行滚动,所有的UITableViewControll ...
- 用OneNote写博客的方法
1.进入OneNote要发布博客的分区然后点击菜单栏中的文件 2.点击发送至博客 3.这时候会启动word程序弹出下面的对话框(如果你从未设置过)点击立即注册 ...