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

Description

Given an undirected graph, in which two vertices can be connected by multiple edges, what is the size of the minimum cut of the graph? i.e. how many edges must be removed at least to disconnect the graph into two subgraphs?

Input

Input contains multiple test cases. Each test case starts with two integers N and M (2 ≤ N ≤ 500, 0 ≤ MN × (N − 1) ⁄ 2) in one line, where N is the number of vertices. Following are M lines, each line contains M integers A, B and C (0 ≤ A, B < N, AB, C > 0), meaning that there C edges connecting vertices A and B.

Output

There is only one line for each test case, which contains the size of the minimum cut of the graph. If the graph is disconnected, print 0.

Sample Input

  1. 3 3
  2. 0 1 1
  3. 1 2 1
  4. 2 0 1
  5. 4 3
  6. 0 1 1
  7. 1 2 1
  8. 2 3 1
  9. 8 14
  10. 0 1 1
  11. 0 2 1
  12. 0 3 1
  13. 1 2 1
  14. 1 3 1
  15. 2 3 1
  16. 4 5 1
  17. 4 6 1
  18. 4 7 1
  19. 5 6 1
  20. 5 7 1
  21. 6 7 1
  22. 4 0 1
  23. 7 3 1

Sample Output

  1. 2
  2. 1
  3. 2

Source

Baidu Star 2006 Semifinal
Wang, Ying (Originator)

Chen, Shixi (Test cases)
 
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. #define MAXN 555
  7. #define inf 1<<30
  8.  
  9. int v[MAXN],dist[MAXN];
  10. int map[MAXN][MAXN];
  11. bool vis[MAXN];
  12. int n,m;
  13.  
  14. //求全局最小割的Stoer_Wanger算法
  15. int Stoer_Wanger(int n)
  16. {
  17. int res=inf;
  18. for(int i=;i<n;i++)v[i]=i;
  19. while(n>){
  20. int k=,pre=;//pre用来表示之前加入A集合的点,我们每次都以0点为第一个加入A集合的点
  21. memset(vis,false,sizeof(vis));
  22. memset(dist,,sizeof(dist));
  23. for(int i=;i<n;i++){
  24. k=-;
  25. for(int j=;j<n;j++){
  26. if(!vis[v[j]]){
  27. dist[v[j]]+=map[v[pre]][v[j]];//dis数组用来表示该点与A集合中所有点之间的边的长度之和
  28. if(k==-||dist[v[k]]<dist[v[j]]){
  29. k=j;
  30. }
  31. }
  32. }
  33. vis[v[k]]=true;
  34. if(i==n-){
  35. res=min(res,dist[v[k]]);
  36. //将该点合并到pre上,相应的边权就要合并
  37. for(int j=;j<n;j++){
  38. map[v[pre]][v[j]]+=map[v[j]][v[k]];
  39. map[v[j]][v[pre]]+=map[v[j]][v[k]];
  40. }
  41. v[k]=v[--n];//删除最后一个点
  42. }
  43. pre=k;
  44. }
  45. }
  46. return res;
  47. }
  48.  
  49. int main()
  50. {
  51. int u,v,w,ss;
  52. while(~scanf("%d%d",&n,&m)){
  53.  
  54. memset(map,,sizeof(map));
  55. while(m--){
  56. scanf("%d%d%d",&u,&v,&w);
  57.  
  58. map[u][v]+=w;
  59. map[v][u]+=w;
  60. }
  61. int ans=Stoer_Wanger(n);
  62. printf("%d\n",ans);
  63. }
  64. return ;
  65. }
 

poj2914 Minimum Cut 全局最小割模板题的更多相关文章

  1. POJ 2914 Minimum Cut 全局最小割

    裸的全局最小割了吧 有重边,用邻接矩阵的时候要小心 #include<iostream> #include<cstdio> #include<bitset> #in ...

  2. POJ 2914 Minimum Cut【最小割 Stoer-Wangner】

    题意:求全局最小割 不能用网络流求最小割,枚举举汇点要O(n),最短增广路最大流算法求最大流是O(n2m)复杂度,在复杂网络中O(m)=O(n2),算法总复杂度就是O(n5):就算你用其他求最大流的算 ...

  3. hdu 6214 Smallest Minimum Cut(最小割的最少边数)

    题目大意是给一张网络,网络可能存在不同边集的最小割,求出拥有最少边集的最小割,最少的边是多少条? 思路:题目很好理解,就是找一个边集最少的最小割,一个方法是在建图的时候把边的容量处理成C *(E+1 ...

  4. 2017青岛赛区网络赛 Smallest Minimum Cut 求最小割的最小割边数

    先最大流跑一遍 在残存网络上把满流边容量+1 非满流边容量设为无穷大 在进行一次最大流即可 (这里的边都不包括建图时用于反悔的反向边) #include<cstdio> #include& ...

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

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

  6. UVALive 5099 Nubulsa Expo(全局最小割)

    题面 vjudge传送门 题解 论文题 见2016绍兴一中王文涛国家队候选队员论文<浅谈无向图最小割问题的一些算法及应用>4节 全局最小割 板题 CODE 暴力O(n3)O(n^3)O(n ...

  7. POJ 2914 Minimum Cut (全局最小割)

    [题目链接] http://poj.org/problem?id=2914 [题目大意] 求出一个最小边割集,使得图不连通 [题解] 利用stoerwagner算法直接求出全局最小割,即答案. [代码 ...

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

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

  9. POJ 2914 - Minimum Cut - [stoer-wagner算法讲解/模板]

    首先是当年stoer和wagner两位大佬发表的关于这个算法的论文:A Simple Min-Cut Algorithm 直接上算法部分: 分割线 begin 在这整篇论文中,我们假设一个普通无向图G ...

随机推荐

  1. 【UVA10652】Board Wrapping(求凸包面积)

    点此看题面 大致题意: 告诉你若干个矩形的重心坐标.长.宽和相对\(y\)轴的偏转角度,求矩形面积和与能围住这些矩形的最小凸包面积之比. 矩形面积和 这应该是比较好求的吧. 已经给了你长和宽,直接乘起 ...

  2. TypeScript task

    Ctrl+Shift+B 生成 js 文件.

  3. Bootstrap历练实例:简单的可折叠

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  4. SQL查询出每门课都大于80 分的学生姓名

    Course表如下: 查询出每门课都大于80 分的学生姓名有两种方法. 1.select  distinct name from Course where name not in (select di ...

  5. MySQL 5.7 在线启用和关闭GTID

    1.相关基础 MySQL 5.7.6之后GTID_MODE提供了两个新的选项分别为ON_PERMISSIVE和OFF_PERMISSIVEOFF_PERMISSIVE:不产生GTID事务, Slave ...

  6. bootstrap validation submit

    表单提交校验功能 前端样式用bootstrap,依赖jquery,应用jquery自带的validation插件. 其实校验是一个小功能,做了还几天主要是因为碰到了两个问题,一个是对于提示信息样式添加 ...

  7. git与github账号建立SSH连接

    第1步:创建SSH Key.在用户主目录下,(就是在你的工作空间一层)看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步 ...

  8. ZRDay6A. 萌新拆塔(三进制状压dp)

    题意 Sol 这好像是我第一次接触三进制状压 首先,每次打完怪之后吃宝石不一定是最优的,因为有模仿怪的存在,可能你吃完宝石和他打就GG了.. 因此我们需要维护的状态有三个 0:没打 1:打了怪物 没吃 ...

  9. Redis常用诊断命令

    1.info 命令查看redis信息,可以指定要查看的section名 sections:Server,clients,memory,persistence,stats,replication,cpu ...

  10. 了解并使用springAOP(面向切面编程)

    Aop是干嘛的为什么要使用它 在业务系统中,总有一些散落,渗透到系统的各处且不得不处理的事情,这些穿插在既定业务中的操作就是所谓的“横切逻辑”,也称切面, 我们怎样才不受这些附加要求的干扰,专心于真正 ...