题意:给出无向图的点,边,权值。求最小割。

思路:根据题目规模,最大流算法会超时。

网上参考的模板代码。

代码:

/*最小割集◎Stoer-Wagner算法:一个无向连通网络,去掉一个边集可以使其变成两个连通分量则这个边集就是割集;最小割集当然就权和最小的割集。

prim算法不仅仅可以求最小生成树,也可以求“最大生成树”。最小割集Stoer-Wagner算法就是典型的应用实例。
求解最小割集普遍采用Stoer-Wagner算法,不提供此算法证明和代码,只提供算法思路:
1.min=MAXINT,固定一个顶点P
2.从点P用类似prim的s算法扩展出“最大生成树”,记录最后扩展的顶点和最后扩展的边
3.计算最后扩展到的顶点的切割值(即与此顶点相连的所有边权和),若比min小更新min
4.合并最后扩展的那条边的两个端点为一个顶点(当然他们的边也要合并,这个好理解吧?)
5.转到2,合并N-1次后结束
6.min即为所求,输出min
prim本身复杂度是O(n^2),合并n-1次,算法复杂度即为O(n^3)
如果在prim中加堆优化,复杂度会降为O((n^2)logn)
*/
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define N 505
#define inf 1000000000
int n, m;
int g[N][N];
int dist[N], node[N];
bool used[N];
inline int min(int a, int b)
{
return (a<b)?a:b;
}
int mincut()
{
int i, j, k, pre, maxj, ans = inf;
for(i = 0; i < n; i++)
node[i] = i; //保存顶点 ,固定顶点为0
while(n > 1)
{
memset(used,0,sizeof(used));
maxj = 1;
used[node[0]] = 1;
for(i = 1; i < n; i++)
{
dist[node[i]] = g[node[0]][node[i]]; //初始化距离数组dist[]
if(dist[node[i]] > dist[node[maxj]]) //寻找最大距离——求最大生成树
maxj = i;
}
pre = 0;
//求最大生成树,并进行最小割操作。
for(i = 1; i < n; i++)
{
if(i == n-1)
{
//只剩最后一个没加入集合的点,更新最小割
ans = min(ans,dist[node[maxj]]);
for(k = 0; k < n; k++) //合并最后一个点以及推出它的集合中的点
g[node[k]][node[pre]] = g[node[pre]][node[k]] += g[node[k]][node[maxj]];
node[maxj] = node[--n];//缩点后的图
}
used[node[maxj]] = 1;
pre = maxj;
maxj = -1;
for(j = 1; j < n; j++)
if(!used[node[j]])
{
//将上次求的maxj加入集合,合并与它相邻的边到割集
dist[node[j]] += g[node[pre]][node[j]];//dist[]保存的是一个积累量。
if(maxj == -1 || dist[node[maxj]] < dist[node[j]])
maxj = j;
}
}
}
return ans;
}
int main()
{
while(scanf("%d %d",&n,&m) != -1)
{
memset(g,0,sizeof(g));
while(m--)
{
int a, b, c;
scanf("%d %d %d",&a,&b,&c);
g[a][b] += c;
g[b][a] += c;
}
printf("%d\n",mincut());
}
return 0;
}

poj2914无向图的最小割模板的更多相关文章

  1. poj2914无向图的最小割

    http://blog.csdn.net/vsooda/article/details/7397449 //算法理论 http://www.cnblogs.com/ylfdrib/archive/20 ...

  2. ZOJ 2753 Min Cut (Destroy Trade Net)(无向图全局最小割)

    题目大意 给一个无向图,包含 N 个点和 M 条边,问最少删掉多少条边使得图分为不连通的两个部分,图中有重边 数据范围:2<=N<=500, 0<=M<=N*(N-1)/2 做 ...

  3. poj2914 Minimum Cut 全局最小割模板题

    Minimum Cut Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 8324   Accepted: 3488 Case ...

  4. ISAP 最大流 最小割 模板

    虽然这道题用最小割没有做出来,但是这个板子还是很棒: #include<stdio.h> #include<math.h> #include<string.h> # ...

  5. 最大流/最小割模板(isap) POJ1273

    isap模板核心代码: //d[]为距离标号数组,d[i]表示节点i到汇点的距离 //gap[]为GAP优化数组,gap[i]表示到汇点距离为i的节点个数 int dfs(int k,int flow ...

  6. 全局最小割模板(定S,不定T,找最小割)

    #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #inc ...

  7. POJ2914 Minimum Cut —— 最小割

    题目链接:http://poj.org/problem?id=2914 Minimum Cut Time Limit: 10000MS   Memory Limit: 65536K Total Sub ...

  8. poj 3469 最小割模板sap+gap+弧优化

    /*以核心1为源点,以核心2为汇点建图,跑一遍最大流*/ #include<stdio.h> #include<string.h> #include<queue> ...

  9. 最小割分治(最小割树):BZOJ2229 && BZOJ4519

    定理:n个点的无向图的最小割最多n-1个. 可能从某种形式上形成了一棵树,不是很清楚. 最小割分治:先任选两个点求一边最小割,然后将两边分别递归,就能找到所有的最小割. 这两个题是一样的,直接搬din ...

随机推荐

  1. Python学习——(1)Centos安装Flask

    一.环境 [root@localhost myproject]# cat /proc/version centos6.5 Linux version 2.6.32-642.11.1.el6.i686 ...

  2. 4. leetcode 461. Hamming Distance

    The Hamming distance between two integers is the number of positions at which the corresponding bits ...

  3. github 上传下载代码简单使用

    很长时间,一直认为github很难操作,其实认真学了发现也不是很困难. 主要就3个命令 git clone 建立空间 git push 提交代码,git pull拉取代码. git clone htt ...

  4. python8 字符串操作

    name = "my name is {name} and i am {year} old" print(name.capitalize()) print(name.count(& ...

  5. java 内存模型的理解

    之前一直在实习,博客停写了一段时间,现在秋招开始了,所以辞职回来专心看书,同时将每天的收获以博客的形式记录下来.最近在看jvm相关的书籍,下面对面试中问得最多的部分--java 内存模型. 本篇博客大 ...

  6. TP3.2二级导航与高亮显示

    闲来无事,记记笔记 二级导航的实现,就是一个二级联动,嗯 先来看看数据库,我喜欢用一个表,表多了就不好玩了 二级代号取一级导航的代号就行了,做个简单的栗子: 代码部分: 看控制器,大头在这: < ...

  7. MySQL编程基础

    本文是关于MySQL编程中的一些基础知识,包括变量和运算符.常用语句.函数. 一.变量与运算符 1.用户会话变量声明:SET @变量名 = 表达式;//即:用户会话变量无需提前定义,直接用赋值语句赋值 ...

  8. SpringMVC 初级操作

    SpringMVC介绍 SpringMVC也叫Spring Web MVC,属于表现层框架. SpringMVC属于Spring框架的一部分,是在Spring3.0后发布的. Spring结构图: S ...

  9. CSS选择器 - 性能的探究及提升

    [本博客为原创:http://www.cnblogs.com/HeavenBin/]  前言: 在工作中编写CSS样式表时随着选择器层数的增加总会看到选择器又丑又长的情况,利用工作之余研究从其命名再到 ...

  10. canvas基础语法

    前面的话 canvas顾名思义是定义在浏览器中的画布.它不仅是一个普通的元素,更是一个强大的编程工具.它的出现已然超过了web基于文档的设计初衷,将网页这一形态的应用推向了另一个高度.利用canvas ...