利用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算法的更多相关文章

  1. POJ 2914 Minimum Cut Stoer Wagner 算法 无向图最小割

    POJ 2914 题意:给定一个无向图 小于500节点,和边的权值,求最小的代价将图拆为两个联通分量. Stoer Wagner算法: (1)用类似prim算法的方法求"最大生成树" ...

  2. 图论(floyd算法):NOI2007 社交网络

    [NOI2007] 社交网络 ★★   输入文件:network1.in   输出文件:network1.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述] 在社交网络( ...

  3. 图论之Dijkstra算法

    Dijkstra算法是图论中经典的最短路径算法之一,主要用于解决单源最短路径问题. 单源最短路径问题,即求某个源节点到其他各个节点的最短路径. Dijkstra算法采用了贪心算法的思想,如图求1号节点 ...

  4. 图论(二分图,KM算法):HDU 3488 Tour

    Tour Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  5. poj Minimum( CutStoer Wagner算法)

    Minimum Cut 题目: 给出一张图.要求你删除最小割权和图. 算法分析: ////////////////////     转载 --- ylfdrib   ///////////////// ...

  6. 图论——最短路径 Dijkstra算法、Floyd算法

    1.弗洛伊德算法(Floyd) 弗洛伊算法核心就是三重循环,M [ j ] [ k ] 表示从 j 到 k 的路径,而 i 表示当前 j 到 k 可以借助的点:红色部分表示,如果 j 到 i ,i 到 ...

  7. 图论:Dinic算法

    解决最大流问题我搜到了一堆的算法:EK算法.FF算法.Dinic算法.SAP算法.ISAP算法 然而并没有什么鸟用 掌握最常见的Dinic就够了,据说极限优化的ISAP比Dinic更快一些..我当不知 ...

  8. 图论:Gale-Shapley算法

    Gale-Shapley算法又叫做延迟认可算法,它可以解决这么一个问题 一共有N位男士和N位女士 每位男士对每位女士都有一个好感度,让他们结合成为N对夫妻,要求男士优先表白,最后问结合情况 第一轮,每 ...

  9. 图论:KM算法

    如果,将求二分图的最大匹配的所有匹配边的权重看做1 那么用匈牙利算法求二分图的最大匹配的问题也可以看成求二分图的最大权匹配 如果边权是特例,我们就要使用KM算法来做了 这个算法其实还是比较难的,会用就 ...

随机推荐

  1. 【转】odoo11新功能及绿色版汇总

    昆山-Jeffery 11:34:00 ,odoo11 新功能: 评论:看到截图,感觉美工上又有所提高 官方的发布说明:https://www.odoo.com/nl_NL/page/odoo-11- ...

  2. C语言RL78 serial bootloader和C#语言bootloader PC端串口通信程序

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 前段时间完成的hype ...

  3. Django-Content-type用法

    from django.db import models from django.contrib.contenttypes.models import ContentType from django. ...

  4. 【目录】Spring 源码学习

    [目录]Spring 源码学习 jwfy 关注 2018.01.31 19:57* 字数 896 阅读 152评论 0喜欢 9 用来记录自己学习spring源码的一些心得和体会以及相关功能的实现原理, ...

  5. [电子书] 《Android编程兵书》PDF

    Android编程兵书 内容简介: 这是一本Android开发书籍,内容讲解详细,例子丰富,能帮助读者举一反三.在<Android编程兵书>中,每一个知识点的描述都非常详细,并且每一个知识 ...

  6. XPATH之normalize-space(.)和normalize-space(text())区别

    normalize,字面意思就是正规化,加上space大概意思就是空格的处理了. 官方解释是这样的: 通过去掉前导和尾随空白并使用单个空格替换一系列空白字符,使空白标准化.如果省略了该参数,上下文节点 ...

  7. 验证码 java实现的程序

    makeCheckcode.java package pic; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...

  8. HTML5 本地存储Web Storage简单了解

    ​HTML5本地存储规范,定义了两个重要的API :Web Storage  和  本地数据库Web SQL Database. 本地存储Web Storage 实际上是HTML4的cookie存储机 ...

  9. truffle自动化测试脚本

    truffle自动化测试脚本 补充一个unbox 1.部署本地ganache环境 配置文件地址为本地地址 localhost:XXXX 上线的环境为 infura的url 2.命令: truffle ...

  10. Unity3D - UGUI实现Tab键切换输入框、按钮(按Tab键切换高亮显示的UI)

    1.在Hierarchy面板创建能被选中的UI(Button.InputField等). 2.在Canvas上创建C#脚本 TabCutPichon. 3.编写脚本. using System.Col ...