最小割 Stoer-Wagner 算法
来源:互联网 发布:seo网络营销是什么 编辑:程序博客网 时间:2024/05/19 04:53
转自:夜晚的虫子 http://blog.sina.com.cn/s/blog_700906660100v7vb.html
割:在一个图G(V,E)中V是点集,E是边集。在E中去掉一个边集C使得G(V,E-C)不连通,C就是图G(V,E)的一个割;
最小割:在G(V,E)的所有割中,边权总和最小的割就是最小割。
求G的任意s-t最小割Min-C(s,t):
设s,t是途中的两个点且边(s,t)∈E(即s,t之间存在一条边)。如果G的最小割Cut把G分成M,N两个点集
①:如果s∈M,t∈N则Min-C(s,t)= Cut(不讨论)
②:如果s,t∈M(或者s,t∈N)则Min-C(s,t)<= Cut
我们来定义一个Contract(a,b)操作,即把a,b两个点合并,表示为删除节点b,把b的节点信息添加到a上
如下图是做了Contract(5,6)
对于所点v有w(v,5)+=w(v,6)
求s-t最小割的方法
定义w(A,x) = ∑w(v[i],x),v[i]∈A
定义Ax为在x前加入A的所有点的集合(不包括x)
1.令集合A={a},a为V中任意点
2.选取V-A中的w(A,x)最大的点x加入集合
3.若|A|=|V|,结束,否则更新w(A,x),转到2
令倒数第二个加入A的点为s,最后一个加入A的点为t,则s-t最小割为w(At,t)
以Poj (pku) 2914 Minimum Cut
的第三个case为例,图为
G(V,E)
我们设法维护这样的一个w[],初始化为0;
我们把V-A中的点中w[i]最大的点找出来加入A集合;
V-A直到为空
w[]的情况如下
w[i]
0
1
2
3
4
5
6
7
初始值
0
0
0
0
0
0
0
0
A=A∪{0}
---
1
1
1
1
0
0
0
A=A∪{1}
---
2
2
1
0
0
0
A=A∪{2}
---
3
1
0
0
0
A=A∪{3}
---
1
0
0
1
A=A∪{4}
---
1
1
2
A=A∪{7}
2
2
---
A=A∪{5}
---
3
A=A∪{6}
---
每次w[i]+=∑(i,a)的权值a∈A
记录最后加入A的节点为t=6,倒数第二个加入A的为s=5,则s-t的最小割就为w[s],在图中体现出来的意思就是5-6的最小割为w[s]=3
然后我们做Contract(s,t)操作,得到下图
G(V’,E’)
重复上述操作
w[i]
0
1
2
3
4
5
7
初始值
0
0
0
0
0
0
0
A=A∪{0}
---
1
1
1
1
0
0
A=A∪{1}
---
2
2
1
0
0
A=A∪{2}
---
3
1
0
0
A=A∪{3}
---
1
0
1
A=A∪{4}
---
2
2
A=A∪{5}
---
4
A=A∪{7}
---
s=5,t=7
Contract(s,t)得到
w[i]
0
1
2
3
4
5
初始值
0
0
0
0
0
0
A=A∪{0}
---
1
1
1
1
0
A=A∪{1}
---
2
2
1
0
A=A∪{2}
---
3
1
0
A=A∪{3}
---
1
1
A=A∪{4}
---
4
A=A∪{5}
---
s=4,t=5
Contract(s,t)得到
w[i]
0
1
2
3
4
初始值
0
0
0
0
0
A=A∪{0}
---
1
1
1
1
A=A∪{1}
---
2
2
1
A=A∪{2}
---
3
1
A=A∪{3}
---
2
A=A∪{4}
---
s=3,t=4
AC代码:
#include <iostream>#include <stdio.h>#include <string.h>#include <queue> #define INT_MAX 0x3f3f3f3f using namespace std; int mp[502][502];int N,M;bool combine[502];int minC=INT_MAX; void search(int &s,int &t){ bool vis[502]; int w[502]; memset(vis,0,sizeof(vis)); memset(w,0,sizeof(w)); int tmpj=1000; for(int i=0;i<N;i++){ int max=-INT_MAX; for(int j=0;j<N;j++){ if(!vis[j]&&!combine[j]&&max<w[j]){ max=w[j]; tmpj=j; } } if(t==tmpj){minC=w[t];return;} vis[tmpj]=1; s=t,t=tmpj; for(int j=0;j<N;j++){ if(!vis[j]&&!combine[j]) w[j]+=mp[t][j]; } } minC=w[t];} int mincut(){ int ans=INT_MAX; int s,t; memset(combine,0,sizeof(combine)); for(int i=0;i<N-1;i++){ s=t=-1; search(s,t); combine[t]=true; ans=ans>minC?minC:ans; for(int j=0;j<N;j++){ mp[s][j]+=mp[t][j]; mp[j][s]+=mp[j][t]; } } return ans;} int main(){ //freopen("in.txt","r",stdin); while(cin>>N>>M){ memset(mp,0,sizeof(mp)); int u,v,w; while(M--){ scanf("%d %d %d",&u,&v,&w); mp[u][v]+=w; mp[v][u]+=w; } cout<<mincut()<<endl; } return 0;}
- 最小割 Stoer-Wagner 算法
- 最小割集Stoer-Wagner算法【ZZ】
- 最小割集Stoer-Wagner算法
- 最小割集Stoer-Wagner算法
- 最小割集Stoer-Wagner算法
- 最小割集Stoer-Wagner算法
- 最小割Stoer-Wagner算法模板hdu3691
- Stoer-Wagner算法求全局最小割
- poj 2914 最小割 Stoer-Wagner 算法
- 全局最小割集Stoer-Wagner算法
- Stoer-Wagner算法(最小割集)
- 【最小割】Stoer-Wagner模板
- 最小割集Stoer-Wagner算法,网络最大流问题
- POJ2914无向图最小割Stoer-Wagner算法
- poj 2914 无向图最小割 Stoer-Wagner算法
- poj 2914(无向图最小割Stoer-Wagner算法)
- 全局最小割Stoer-Wagner算法 时间复杂度(o^3)
- POJ_P2914 Minimum Cut(Stoer-Wagner算法 全局最小割)
- 字符串-03. 字符串的冒泡排序(20)
- 【连通图|点连通度】POJ-1966 Cable TV Network
- 解决Shockwave flash在谷歌浏览器上崩溃的问题
- 智能体2月6号记录
- 谷歌浏览器(Chrome)遇到Flash崩溃的处理办法
- 最小割 Stoer-Wagner 算法
- HDOJ 题目2473 Junk-Mail Filter(并查集,删点)
- [原创]10个人都不坐在自己座位上有多少种可能机率多大
- 字符串-04. 字符串逆序(15)
- 字符串-05. 字符串循环左移(20)
- NS3的安装(一)
- 弹出表情气泡&仿魔兽的技能冷效果却实现
- 08-1. 求一批整数中出现最多的个位数字(20)
- Bash 通过上下键更有效的查找历史命令