最小割算法
来源:互联网 发布:淘宝网开店怎么开 编辑:程序博客网 时间:2024/05/06 17:45
看到得一种最小割算法
这是一个写的不错的文章
h ttp://blog.sina.com.cn/s/blog_700906660100v7vb.html
01.//最小割 Stoer-Wagner 算法<SPAN style="WHITE-SPACE: pre"> </SPAN> 02.//Etrnls 2007-4-15 03.//Stoer-Wagner 算法用来求无向图 G=(V, E)的全局最小割。 04.//算法基于这样一个定理:对于任意s, t V ∈ ,全局最小割或者等于原图的s-t 最小割,或者等于将原图进行 Contract(s, 05.//t)操作所得的图的全局最小割。 06.//算法框架: 07.//1. 设当前找到的最小割MinCut 为+∞ 08.//2. 在 G中求出任意 s-t 最小割 c,MinCut = min(MinCut, c) 09.//3. 对 G作 Contract(s, t)操作,得到 G'=(V', E'),若|V'| > 1,则G=G'并转 2,否则MinCut 为原图的全局最 10.//小割 11.//Contract 操作定义: 12.//若不存在边(p, q),则定义边(p, q)权值w(p, q) = 0 13.//Contract(a, b): 删掉点 a, b 及边(a, b),加入新节点 c,对于任意 v V ∈ ,w(v, c) = w(c, v) = w(a, v) + w(b, 14.//v) 15.//求 G=(V, E)中任意 s-t 最小割的算法: 16.//定义w(A, x) = ∑w(v[i], x),v[i] A ∈ 17.//定义 Ax 为在x 前加入 A 的所有点的集合(不包括 x) 18.//1. 令集合 A={a},a为 V中任意点 19.//2. 选取 V - A中的 w(A, x)最大的点 x加入集合 A 20.//3. 若|A|=|V|,结束 21.//令倒数第二个加入 A的点为 s,最后一个加入 A的点为 t,则s-t 最小割为 w(At, t) 22. 23.//上述做法(转载) 基于两个事实(来自论文a simple and fast min-cut algorithm) 24. 25.//λG= min(λG(u, v), λG/u~v). 26.//For each MA-order v1,...,vn of the undirected,weighted Graph G = (V, E), 27.//the cut({v1,...,vn−1},{vn})is a minimum vn–vn−1-cut //最小割 Stoer-Wagner 算法//Etrnls 2007-4-15//Stoer-Wagner 算法用来求无向图 G=(V, E)的全局最小割。//算法基于这样一个定理:对于任意s, t V ∈ ,全局最小割或者等于原图的s-t 最小割,或者等于将原图进行 Contract(s,//t)操作所得的图的全局最小割。//算法框架://1. 设当前找到的最小割MinCut 为+∞//2. 在 G中求出任意 s-t 最小割 c,MinCut = min(MinCut, c)//3. 对 G作 Contract(s, t)操作,得到 G'=(V', E'),若|V'| > 1,则G=G'并转 2,否则MinCut 为原图的全局最//小割//Contract 操作定义://若不存在边(p, q),则定义边(p, q)权值w(p, q) = 0//Contract(a, b): 删掉点 a, b 及边(a, b),加入新节点 c,对于任意 v V ∈ ,w(v, c) = w(c, v) = w(a, v) + w(b,//v)//求 G=(V, E)中任意 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加入集合 A//3. 若|A|=|V|,结束//令倒数第二个加入 A的点为 s,最后一个加入 A的点为 t,则s-t 最小割为 w(At, t)//上述做法(转载) 基于两个事实(来自论文a simple and fast min-cut algorithm)//λG= min(λG(u, v), λG/u~v).//For each MA-order v1,...,vn of the undirected,weighted Graph G = (V, E),//the cut({v1,...,vn−1},{vn})is a minimum vn–vn−1-cut[cpp] view plaincopyprint?01.#include<cstdio> //代码很难看懂的原因是代码本身不会明确的告诉你代码应用的不明显成立的定理 02.#include<cstring> //代码的最初出处很难找到了 03.using namespace std; 04.const int MAX = 105; 05.const int INF = 1<<30; 06. 07.int n, m, s, t, minCut; 08.int dis[MAX], map[MAX][MAX]; 09.bool vis[MAX], set[MAX]; 10. 11.void search(){ 12. int i, j, ma, tmp; 13. memset(vis, 0, sizeof(vis)); 14. memset(dis, 0, sizeof(dis)); 15. s = t = -1; 16. for(i = 0; i < n; i ++){ //加入点的过程 17. for(ma = -INF, j = 0; j < n; j ++){ 18. if(!set[j] && !vis[j] && dis[j] > ma){ 19. tmp = j; 20. ma = dis[j]; 21. } 22. } 23. if(t == tmp) return; 24. s = t, t = tmp; 25. minCut = ma; 26. vis[tmp] = true; 27. for(j = 0; j < n;j ++){ 28. if(!set[j] && !vis[j]) dis[j] += map[tmp][j]; 29. } 30. } 31. return; 32.} 33. 34.int Stoer_Wagner(){ 35. int i, j, ans = INF; 36. memset(set, 0, sizeof(set)); 37. for(i = 0; i < n-1; i ++){ //缩点n-1次 38. search(); 39. if(minCut < ans) ans = minCut; 40. if(ans == 0) return 0; 41. set[t] = true; //set是被缩了的点 42. for(j = 0; j < n; j ++) 43. if(!set[j]){ 44. map[s][j] += map[t][j]; 45. map[j][s] += map[j][t]; 46. } 47. } 48. return ans; 49.} 50. 51.int main(){ 52. int u, v ,w; 53. while(scanf("%d%d",&n,&m)!=EOF){ 54. memset(map, 0, sizeof(map)); 55. while(m --){ 56. scanf("%d%d%d",&u,&v,&w); 57. map[u][v] += w; 58. map[v][u] += w; 59. } 60. printf("%d\n",Stoer_Wagner()); 61. } 62. return 0; 63.} #include<cstdio> //代码很难看懂的原因是代码本身不会明确的告诉你代码应用的不明显成立的定理#include<cstring> //代码的最初出处很难找到了using namespace std;const int MAX = 105;const int INF = 1<<30;int n, m, s, t, minCut;int dis[MAX], map[MAX][MAX];bool vis[MAX], set[MAX];void search(){ int i, j, ma, tmp; memset(vis, 0, sizeof(vis)); memset(dis, 0, sizeof(dis)); s = t = -1; for(i = 0; i < n; i ++){ //加入点的过程 for(ma = -INF, j = 0; j < n; j ++){ if(!set[j] && !vis[j] && dis[j] > ma){ tmp = j; ma = dis[j]; } } if(t == tmp) return; s = t, t = tmp; minCut = ma; vis[tmp] = true; for(j = 0; j < n;j ++){ if(!set[j] && !vis[j]) dis[j] += map[tmp][j]; } } return;}int Stoer_Wagner(){ int i, j, ans = INF; memset(set, 0, sizeof(set)); for(i = 0; i < n-1; i ++){ //缩点n-1次 search(); if(minCut < ans) ans = minCut; if(ans == 0) return 0; set[t] = true; //set是被缩了的点 for(j = 0; j < n; j ++) if(!set[j]){ map[s][j] += map[t][j]; map[j][s] += map[j][t]; } } return ans;}int main(){ int u, v ,w; while(scanf("%d%d",&n,&m)!=EOF){ memset(map, 0, sizeof(map)); while(m --){ scanf("%d%d%d",&u,&v,&w); map[u][v] += w; map[v][u] += w; } printf("%d\n",Stoer_Wagner()); } return 0;}[cpp] view plaincopyprint?01.#include<cstdio> //上述代码的常数优化 02.#include<cstring> 03.const int N=102; 04.int p[N],dis[N],map[N][N]; 05.bool vis[N]; 06. 07.int mincut(int n){ 08. int ret=0x7fffffff; 09. for(int i=0;i!=n;++i) p[i]=i; 10. while(n>1){ 11. int t=1,s=0; 12. for(int i=1;i!=n;++i){ 13. dis[p[i]]=map[p[0]][p[i]]; 14. if(dis[p[i]]>dis[p[t]]) t=i; 15. } 16. memset(vis,0,sizeof(vis)); 17. vis[p[0]]=true; 18. for(int i=1;i<n;++i){ 19. if(i==n-1){ 20. if(ret>dis[p[t]]) ret=dis[p[t]]; 21. for(int j=0;j!=n;++j){ 22. map[p[j]][p[s]]+=map[p[j]][p[t]]; 23. map[p[s]][p[j]]=map[p[j]][p[s]]; 24. } 25. p[t]=p[--n]; 26. } 27. vis[p[t]]=true; 28. s=t;t=-1; 29. for(int j=1;j!=n;++j){ 30. if(!vis[p[j]]){ 31. dis[p[j]]+=map[p[j]][p[s]]; 32. if(t==-1||dis[p[j]]>dis[p[t]]) t=j; 33. } 34. } 35. } 36. } 37. return ret; 38.} 39. 40.int main(){ 41. int n ,m ,u, p ,w; 42. while(scanf("%d%d",&n,&m)!=EOF){ //节点为0~~~~n-1 43. memset(map, 0, sizeof(map)); 44. while(m --){ 45. scanf("%d%d%d",&u,&p,&w); 46. map[u][p] += w; 47. map[p][u] += w; 48. } 49. printf("%d\n",mincut(n)); 50. } 51. return 0; 52.}
0 0
- 最小割算法
- 最小割算法
- 最大流最小割算法
- 最小割 Stoer-Wagner 算法
- 最大流最小割算法
- 无向图的最小割算法
- 最小割集Stoer-Wagner算法【ZZ】
- 最大流/最小割算法总结
- 最小割集Stoer-Wagner算法
- 最小割集Stoer-Wagner算法
- 网络流最大流最小割算法
- 网络流最大流最小割算法
- 最小割集Stoer-Wagner算法
- poj-2914 最小割stoer算法
- 无向图最小割算法。
- 求全局最小割(SW算法)
- sw算法求最小割学习
- 最大流最小割算法入门理解
- JavaSE(6):java界面编程技术
- ArcGIS教程:为地图册添加动态文本
- android动画-tween动画实现原理
- 代震军BLOG
- Swift编程语言初探
- 最小割算法
- 一些配置心得和总结!! <上>
- shuipfcms二次开发之图片上传
- Eclipse如何连接android手机,测试android程序?
- Android软件安全开发实践
- 什么是gcd
- C/C++中几个宏的简单总结
- C# Mysql 查询 Rownum的解决方法
- “心脏出血”后续:证书撤销的安全隐患