soj 3134: windy和水星 Stoer-Wagner算法求无向图的最小割集:一个无向连通网络,去掉一个边集可以使其变成两个连通分量则这个边集就是割集;最小割集当然就权和最小的割集
2011-09-20 18:03
639 查看
Description
windy被请到了水星交通部,交通部长现在想知道水星的交通安全度为多少在水星上有n座城市,任意两座城市之间有一条权值在[1,10^5]的双向路定义:为了使得这n座城市至少有两座之间不连通,最少需要破坏的权值为安全度求水星的交通安全度Input
输入包含多组测试数据,每组数据第一行有一个整数,n ( 2 <= n <= 100 )接下来n行,每行n个整数,除主对角线外,均为范围在[1,10^5]的整数,对角线上的权值保证为0,保证[i][j]=[j][i]Output
每组数据输出一行,为水星的交通安全度Sample Input
30 1 31 0 23 2 0Sample Output
3//
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 501;
const int MAXV = 0x3F3F3F3F;
int n,m,v[MAXN],mat[MAXN][MAXN],dis[MAXN];
bool vis[MAXN];
int res;
int Stoer_Wagner(int n) {
int res = MAXV;
for (int i = 0;i < n;i++)
v[i] = i;
while (n > 1) {
int maxp = 1,prev = 0;
for (int i = 1;i < n;i++) {//初始化到已圈集合的割大小
dis[v[i]] = mat[v[0]][v[i]];
if (dis[v[i]] > dis[v[maxp]])
maxp = i;
}
memset(vis,0,sizeof(vis));
vis[v[0]] = true;
for (int i = 1;i < n;i++) {
if (i == n - 1) { //只剩最后一个没加入集合的点,更新最小割
res = min(res,dis[v[maxp]]);
for (int j = 0; j < n; j++) { //合并最后一个点以及推出它的集合中的点
mat[v[prev]][v[j]] += mat[v[j]][v[maxp]];
mat[v[j]][v[prev]] = mat[v[prev]][v[j]];
}
v[maxp] = v[--n];//缩点后的图
}
vis[v[maxp]] = true;
prev = maxp;
maxp = -1;
for (int j = 1;j < n;j++)
if (!vis[v[j]]) { //将上次求的maxp加入集合,合并与它相邻的边到割集
dis[v[j]] += mat[v[prev]][v[j]];
if (maxp == -1 || dis[v[maxp]] < dis[v[j]])
maxp = j;
}
}
}
return res;
}
int main()
{
while (scanf("%d", &n) != EOF)
{
memset(mat,0,sizeof (mat));
int x,y,z;
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&mat[i][j]);
}
}
printf("%d\n",Stoer_Wagner(n));
}
}
相关文章推荐
- 任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432, 一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,
- 陈利人 面试题 对于一个n位正整数a,去掉其中任意k(k<=n)个数字后,剩下的数字按原次序排列可以组成一个新的正整数。设计一个删数算法,使得剩下的数字组成的正整数最小。
- poj 3308 最小点权覆盖集, 见 胡驳涛论文里面有讲见图方法 二分图最小权点覆盖 我的想法是一个东西通过两个操作都可以完成,这些操作还可以完成其他的东西,每个操作有一个花费,现在要你选出花费最小的操作。这就是裸的模型
- 对于一个n位正整数a,去掉其中任意k(k<=n)个数字后,剩下的数字按原次序排列可以组成一个新的正整数。设计一个删数算法,使得剩下的数字组成的正整数最小。例如,a=13243221,k=5,输出:12
- 关于最小生成树中的kruskal算法中判断两个点是否在同一个连通分量的方法总结
- 最小割集Stoer-Wagner算法,网络最大流问题
- 图的全局最小割的Stoer-Wagner算法及例题
- 创建进程,调用Rscript运行相关算法[基于本公司的底层,可以修改,完全去掉依赖这个底层]
- 最小割集Stoer-Wagner算法【ZZ】
- 一个袋子里面有n个球,每个球上面都有一个号码(拥有相同号码的球是无区别的)。如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积。 例如:如果袋子里面的球的号码是{1, 1, 2, 3},这个袋子就是幸运的,因为1 + 1 + 2 + 3 > 1 * 1 * 2 * 3 你可以适当从袋子里移除一些球(可以移除0个,但是别移除完),要使移除后的袋子是幸运的。现在让你编程计算一下你可以获得
- 给定一颗二叉树,以及其中的两个node(地址均非空),要求给出这两个node的一个公共父节点,使得这个父节点与两个节点的路径之和最小。
- poj2914(stoer-wagner算法求解全局最小割)
- 最小割Stoer-Wagner算法模板hdu3691
- 输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数.输入数据有多组,每组占一行,每行的开始是一个整数n,表示这个测试实例的数值的个数,跟着就是n个整数。n=0表示输入的结束,
- 最小割 Stoer-Wagner 算法
- 全局最小割Stoer-Wagner算法 时间复杂度(o^3)
- 每天一道算法题(二):给定数组Arr和一个整数aim,请返回哪两个位置的数可以加出aim来。
- 翻转子串 假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串。请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次检查子串的函数。
- 一个弹出层,相对浏览器居中,可以随浏览器缩放大小,有最大值和最小值(当然不支持ie6)
- poj 2914 最小割 Stoer-Wagner 算法