POJ 2914 Minimum Cut 最小割算法题解
最标准的最小割算法应用题目。
核心思想就是缩边:先缩小最大的边。然后缩小次大的边。依此缩小
基础算法:Prime最小生成树算法
只是本题測试的数据好像怪怪的,相同的算法时间执行会区别非常大,并且一样的代码替换。竟然会WA。系统出错的几率非常小。难倒測试系统本题会有错误?
懒得继续測试这道题的系统了,反正算法正确。AC。
#include <stdio.h>
#include <string.h>
#include <limits.h> const int MAX_N = 500;
int N, M, A, B, C, S, T;
int gra[MAX_N][MAX_N], dis[MAX_N];
bool vis[MAX_N], delVer[MAX_N]; inline int min(int a, int b) { return a < b ? a : b; } int search(int V) //V为计算剩下多少顶点了
{
memset(vis, 0, sizeof(vis));
memset(dis, 0, sizeof(dis));
int curMax = 0, cur = 0;
S = 0, T = 0;
for (int i = 1; i < V; i++)
{
curMax = 0;
for (int j = 1; j < N; j++)
{
if (!vis[j] && !delVer[j]) dis[j] += gra[cur][j];
} for (int j = 1; j < N; j++)
{
if (!vis[j] && !delVer[j] && dis[j] > curMax)
{
curMax = dis[j];
cur = j;
}
}
vis[cur] = true;
if (T == cur) return 0; //图不相连。提前结束循环,割点为0
S = T; T = cur; //目的得到最后和倒数第二节点。以便进行缩图
}
return curMax;
} //核心思想:先缩小最大的边,然后缩小次大的边,依此缩小
int Stoer_Wagner()
{
memset(delVer, 0, sizeof(delVer));
int minCut = INT_MAX;
for (int v = N; v > 1; v--) //共N-1条边, 当前v个点
{
minCut = min(minCut, search(v));
if (minCut == 0) return 0; //一点优化,提前结束
delVer[T] = true;
for (int i = 0; i < N; i++)
if (!delVer[i]) gra[S][i] = gra[i][S] += gra[T][i];
}
return minCut == INT_MAX ? 0 : minCut;//仅仅有一个顶点的时候返回0
} int main()
{
while (~scanf("%d %d", &N, &M))
{
memset(gra, 0, sizeof(gra));
for (int i = 0; i < M; i++)
{
scanf("%d %d %d", &A, &B, &C);
gra[B][A] = gra[A][B] += C;
}
printf("%d\n", Stoer_Wagner());
}
return 0;
}
POJ 2914 Minimum Cut 最小割算法题解的更多相关文章
- POJ 2914 Minimum Cut 最小割图论
Description Given an undirected graph, in which two vertices can be connected by multiple edges, wha ...
- POJ 2914 Minimum Cut Stoer Wagner 算法 无向图最小割
POJ 2914 题意:给定一个无向图 小于500节点,和边的权值,求最小的代价将图拆为两个联通分量. Stoer Wagner算法: (1)用类似prim算法的方法求"最大生成树" ...
- POJ2914 Minimum Cut —— 最小割
题目链接:http://poj.org/problem?id=2914 Minimum Cut Time Limit: 10000MS Memory Limit: 65536K Total Sub ...
- POJ 2914 Minimum Cut (全局最小割)
[题目链接] http://poj.org/problem?id=2914 [题目大意] 求出一个最小边割集,使得图不连通 [题解] 利用stoerwagner算法直接求出全局最小割,即答案. [代码 ...
- POJ 2914 Minimum Cut【最小割 Stoer-Wangner】
题意:求全局最小割 不能用网络流求最小割,枚举举汇点要O(n),最短增广路最大流算法求最大流是O(n2m)复杂度,在复杂网络中O(m)=O(n2),算法总复杂度就是O(n5):就算你用其他求最大流的算 ...
- POJ 2914 Minimum Cut 全局最小割
裸的全局最小割了吧 有重边,用邻接矩阵的时候要小心 #include<iostream> #include<cstdio> #include<bitset> #in ...
- POJ 2914 - Minimum Cut - [stoer-wagner算法讲解/模板]
首先是当年stoer和wagner两位大佬发表的关于这个算法的论文:A Simple Min-Cut Algorithm 直接上算法部分: 分割线 begin 在这整篇论文中,我们假设一个普通无向图G ...
- POJ 2914 Minimum Cut
Minimum Cut Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 9319 Accepted: 3910 Case ...
- HDU 6214 Smallest Minimum Cut 最小割,权值编码
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6214 题意:求边数最小的割. 解法: 建边的时候每条边权 w = w * (E + 1) + 1; 这 ...
随机推荐
- Linux-清除rootpassword
1.Linux进入单用户模式,通常选择内核按e 最后加入single,按b进入单用户. 2.清除/etc/shadow中root这一行第一个:符号和第二个:符号之间内容. 3.正常启动,passwd ...
- Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier)
转自:http://www.cnblogs.com/kaka/archive/2013/03/06/2945514.html 比较的是四种复制的方式,分别为Apache的BeanUtils和Prope ...
- js全选反选按钮实现
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- C++ 指针与引用 知识点 小结
[摘要] 指针能够指向变量.数组.字符串.函数.甚至结构体.即指针能够指向不同数据对象.指针问题 包含 常量指针.数组指针.函数指针.this指针.指针传值.指向指针的指针 等. 主要知识点包含:1. ...
- ZOJ 题目3587 Marlon's String(KMP)
Marlon's String Time Limit: 2 Seconds Memory Limit: 65536 KB Long long ago, there was a coder n ...
- c#中反射的用法(即如何根据字符找到已定义的变量)
2013-07-20 08:06 720人阅读 评论(0) 收藏 举报 分类: C#(9) 作者同类文章 X 版权声明:本文为博主原创文章,未经博主允许不得转载. 常常羡慕javascript中, ...
- [转]C#连接操作mysql实例
本文转自:http://hi.baidu.com/zhqngweng/item/c4d2520cb7216877bfe97edf 第三方组件:Mysql.Data.dll说明:去官方网站下载Mysql ...
- 网络IO
1.前言 在网络编程中,阻塞.非阻塞.同步.异步经常被提到.unix网络编程第一卷第六章专门讨论五种不同的IO模型,Stevens讲的非常详细,我记得去年看第一遍时候,似懂非懂,没有深入理解.网上有详 ...
- JS学习笔记 - fgm练习 - 鼠标移入/移出div样式改变
思路: div的默认样式正常设置. 鼠标移入时,发生改变的样式有3个,即 边框颜色,div背景色,字体颜色. 把这三个css改变设置在一个类名下,再通过js给div动态 添加/去除这个类名,实现div ...
- (转)c++ 中的using namespace std是什么意思,什么时候用
使用std命名空间 98年以后的c++语言提供一个全局的命名空间namespace,可以避免导致全局命名冲突问题.举一个实例,请注意以下两个头文件: // one.hchar func(char);c ...