`

POJ 2914 Minimum Cut (Stoer_Wagner最小割)

阅读更多
Minimum Cut
Time Limit: 10000MS   Memory Limit: 65536K
Total Submissions: 6448   Accepted: 2686
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 ≤ M ≤ N × (N − 1) ⁄ 2) in one line, where N is the number of vertices. Following are M lines, each line contains M integers AB and C (0 ≤ AB < NA ≠ BC > 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

3 3
0 1 1
1 2 1
2 0 1
4 3
0 1 1
1 2 1
2 3 1
8 14
0 1 1
0 2 1
0 3 1
1 2 1
1 3 1
2 3 1
4 5 1
4 6 1
4 7 1
5 6 1
5 7 1
6 7 1
4 0 1
7 3 1

Sample Output

2
1
2

Source

Baidu Star 2006 Semifinal 
Wang, Ying (Originator) 
Chen, Shixi (Test cases)
 
#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

const int VM=520;
const int INF=0x3f3f3f3f;

int n,m,mincut,src,des;
int map[VM][VM],dis[VM],vis[VM],combine[VM];

void Search(){   //最大生成树
    int i,j,k;
    memset(vis,0,sizeof(vis));
    memset(dis,0,sizeof(dis));
    src=des=-1;
    int tmp;
    for(i=0;i<n;i++){
        tmp=-INF;
        for(j=0;j<n;j++)
            if(!combine[j] && !vis[j] && tmp<dis[j]){
                k=j;
                tmp=dis[j];
            }
        if(k==des)
            return ;
        src=des;  des=k;    //最后两个扩展的顶点。
        /*
        printf("---> i=%d   k=%d\n",i,k);
        printf("@@@@@@@@@@@@@@@\n");
        for(j=0;j<n;j++)
            printf("%d ",dis[j]);
        printf("\n");
        printf("@@@@@@@@@@@@@@@\n");
        */
        mincut=dis[k];
        vis[k]=1;
        for(j=0;j<n;j++)
            if(!combine[j] && !vis[j])
                dis[j]+=map[k][j];
    }
}

int Stoer_Wagner(){
    memset(combine,0,sizeof(combine));
    int ans=INF;  //min=MAXINT,固定一个顶点P
    for(int i=0;i<n-1;i++){
        Search();   //从点P用“类似”prim的s算法扩展出“最大生成树”,记录最后扩展的顶点和最后扩展的边
        /*
        printf("---------------\n");
        printf("i=%d  :   ",i);
        for(int j=0;j<n;j++)
            printf("%d ",dis[j]);
        printf("\n");
        printf("---------------\n");
        */
        ans=min(ans,mincut);    //计算最后扩展到的顶点的切割值(即与此顶点相连的所有边权和),若比min小更新min
        if(ans==0)  //图不连通时最小割为0
            return 0;
        combine[des]=1;
        for(int j=0;j<n;j++)    //合并最后扩展的那条边的两个端点为一个顶点
            if(!combine[j]){
                map[src][j]+=map[des][j];
                map[j][src]+=map[j][des];
            }
    }
    return ans;
}

int main(){

    //freopen("input.txt","r",stdin);

    while(~scanf("%d%d",&n,&m)){
        memset(map,0,sizeof(map));
        int u,v,w;
        while(m--){
            scanf("%d%d%d",&u,&v,&w);
            map[u][v]+=w;
            map[v][u]+=w;
        }
        printf("%d\n",Stoer_Wagner());
    }
    return 0;
}
 
分享到:
评论

相关推荐

    Stoer-Wagner算法求全局最小割(模板)

    在POJ2914题中,提供了Stoer-Wagner 算法的实现代码,该代码使用C++语言编写,使用prim算法计算图的最小割,并输出图的全局最小割结果。 Stoer-Wagner 算法是一种常用的算法,用于计算图的全局最小割,该算法可以...

    poj2775.rar_poj_poj 27_poj27_poj2775

    标签"poj poj_27 poj27 poj2775"进一步确认了这是一道关于POJ平台的编程挑战,其中"poj_27"可能是表示第27类问题或者某种分类,而"poj27"可能是对"poj2775"的简写。 压缩文件中的"www.pudn.com.txt"可能是一个链接...

    jihe.rar_2289_POJ 3714_poj3714_poj3714 Ra_visual c

    标题中的"jihe.rar_2289_POJ 3714_poj3714_poj3714 Ra_visual c" 提到了一个压缩文件,可能包含有关编程竞赛或算法解决的资源,特别是与POJ(Problem On Judge)平台上的问题3714相关的。"Ra_visual c"可能指的是...

    poj3601.rar_POJ3601_poj 36_visual c

    【标题】"POJ3601.rar" 是一个压缩包文件,主要包含了对北京大学在线评测系统(Online Judge)上的一道题目——POJ 3601的解答和相关实验报告。"POJ 3601"是这道编程问题的编号,通常在编程竞赛或练习平台中,每个...

    poj2488.rar_poj24_poj2488_方向模板法

    标题中的“poj2488.rar_poj24_poj2488_方向模板法”指的是一个解决编程竞赛问题POJ2488的压缩文件,其中可能包含了解决该问题的代码示例。POJ是Programming Online Judge的缩写,是一个在线的编程竞赛平台,参与者...

    POJ_3131.zip_POJ 八数码_poj

    标题中的“POJ_3131.zip_POJ 八数码_poj”指的是一个与编程竞赛网站POJ(Problem Set Algorithm)相关的项目,具体是针对3131号问题的解决方案,该问题涉及到了八数码游戏。八数码游戏,又称滑动拼图,是一个经典的...

    poj_1699.rar_1699_poj_poj1699

    【标题】"poj_1699.rar_1699_poj_poj1699" 提供的是一个关于POJ(编程在线判题系统)第1699题的解决方案,其中包含了该问题的代码实现和解题思路。POJ是一个流行的在线编程竞赛平台,它为参赛者提供了各种算法题目,...

    poj_2682(3).rar_C++ 数组扩充_poj 26_poj 2682_poj26

    标题中的"poj_2682(3).rar"是一个指向编程竞赛问题的引用,通常这类问题在网站如POJ(Programming Online Judge)上出现,供程序员解决并提交代码进行测试。这个问题的编号是2682,可能涉及到特定的数据结构或算法...

    pku1151.rar_Atlantis_pku 11_poj Atlant_poj Atlantis_poj11

    标题中的“pku1151.rar_Atlantis_pku 11_poj Atlant_poj Atlantis_poj11”似乎是指北京大学(Peking University, PKU)编程竞赛中的一道题目,编号为1151,与“Atlantis”这个主题相关。这道题目在多个平台上也被提及...

    poj_3310.rar_3310_poj

    【标题】"poj_3310.rar_3310_poj"是一个与编程竞赛相关的压缩包,其中包含了对POJ(Problem Online Judge)3310问题的解决方案和详细解析。POJ是一个著名的在线编程竞赛平台,提供各种算法题目供参赛者练习和提交...

    POJ100题_C++_源码

    【标题】"POJ100题_C++_源码" 涉及的是C++编程语言在解决算法竞赛中的应用,尤其是针对POJ(Programming Online Judge)平台上的编程题目。POJ是一个在线的编程练习系统,它提供了一系列的算法问题供用户练习,提升...

    POJ-2151.rar_poj

    【标题】"POJ-2151.rar_poj"是一个与编程竞赛相关的压缩文件,主要涉及的问题是“检查问题的难度”,并且是为动态规划的实战练习而设计的。这个题目来自于著名的在线编程竞赛平台POJ(Programming Online Judge)。 ...

    pku_poj_2187.rar_poj 2187_凸包问题

    标题中的“pku_poj_2187.rar_poj 2187_凸包问题”表明这是一个关于北京大学(Peking University, PKU)编程竞赛平台POJ上的第2187题,题目主要涉及凸包问题。描述中的“O(nlogn)凸包问题 poj2187”提示我们解决这个...

    poj_cpp.zip_MS_292AC_

    【标题】"poj_cpp.zip_MS_292AC_" 提示我们这是一份与POJ(编程在线判题系统)相关的压缩包,主要包含C++语言的解答,且可能涉及了MS(Microsoft)和292AC这两个特定的关键词。在POJ平台上,"MS_292AC_"可能是某个...

    poj1038--Bugs.rar_Bugs_poj 1038 _poj10_poj1038

    标题中的“poj1038--Bugs.rar”是一个关于解决编程竞赛问题的压缩文件,其中包含了对“Bugs”问题的解答。POJ(Problemset Online Judge)是一个在线编程竞赛平台,它提供了一系列的问题供参赛者解决,旨在锻炼和...

    POJ.rar_C++_oj_本科_程序设计实习

    【标题】"POJ.rar_C++_oj_本科_程序设计实习" 提供的信息表明,这是一个与C++编程语言相关的在线判题(Online Judge,简称OJ)练习资源,主要面向本科阶段的学生,用于程序设计实习。POJ,全称是Problemset on the ...

    POJ3277.rar_3277 poj_poj3277_多个面积_线段树

    标题中的“POJ3277.rar_3277 poj_poj3277_多个面积_线段树”是指一个与编程竞赛相关的压缩文件,特别提到了POJ(Problemset Online Judge)的第3277号问题。POJ是一个著名的在线编程竞赛平台,参与者需要解决各种...

    POJ2516__最小费用最大流

    poj2516代码最小费用最大流

    POJ-1170.rar_poj

    标题中的“POJ-1170.rar_poj”指的是编程竞赛网站POJ(Programming Online Judge)上的一个问题,编号为1170。POJ是一个在线的编程练习平台,主要面向学习和提升算法与编程技能的用户。这个问题的解决方案可能包含在...

    1010_stamps.zip_1010_POJ 1010_poj_poj stamps_poj10

    《POJ 1010 Stamps:解题思路与陷阱分析》 POJ 1010,也被称为“邮票问题”,是编程竞赛中的一道经典题目,旨在考察参赛者的动态规划和数学思维能力。这个题目在编程爱好者中具有较高的知名度,因为它涉及到有趣的...

Global site tag (gtag.js) - Google Analytics