POJ 2914 Minimum Cut

无向图最小割,Stoer Wanger算法。先找了个模板,日后再学习吧...

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 555
#define inf 1<<30

int v[MAXN],dist[MAXN];
int map[MAXN][MAXN];
bool vis[MAXN];
int n,m;

//求全局最小割的Stoer_Wanger算法
int Stoer_Wanger(int n)
{
    int res=inf;
    for(int i=0;i<n;i++)v[i]=i;
    while(n>1){
        int k=0,pre=0;//pre用来表示之前加入A集合的点,我们每次都以0点为第一个加入A集合的点
        memset(vis,false,sizeof(vis));
        memset(dist,0,sizeof(dist));
        for(int i=1;i<n;i++){
            k=-1;
            for(int j=1;j<n;j++){
                if(!vis[v[j]]){
                    dist[v[j]]+=map[v[pre]][v[j]];//dis数组用来表示该点与A集合中所有点之间的边的长度之和
                    if(k==-1||dist[v[k]]<dist[v[j]]){
                        k=j;
                    }
                }
            }
            vis[v[k]]=true;
            if(i==n-1){
                res=min(res,dist[v[k]]);
                //将该点合并到pre上,相应的边权就要合并
                for(int j=0;j<n;j++){
                    map[v[pre]][v[j]]+=map[v[j]][v[k]];
                    map[v[j]][v[pre]]+=map[v[j]][v[k]];
                }
                v[k]=v[--n];//删除最后一个点
            }
            pre=k;
        }
    }
    return res;
}

int main()
{
    int u,v,w;
    while(~scanf("%d%d",&n,&m)){
        memset(map,0,sizeof(map));
        while(m--){
            scanf("%d%d%d",&u,&v,&w);
            map[u][v]+=w;
            map[v][u]+=w;
        }
        int ans=Stoer_Wanger(n);
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-08-06 20:08:52

POJ 2914 Minimum Cut的相关文章

POJ 2914 Minimum Cut 最小割算法题解

最标准的最小割算法应用题目. 核心思想就是缩边:先缩小最大的边,然后缩小次大的边,依此缩小 基础算法:Prime最小生成树算法 不过本题测试的数据好像怪怪的,同样的算法时间运行会差别很大,而且一样的代码替换,居然会WA.系统出错的几率很小,难倒测试系统本题会有错误? 懒得继续测试这道题的系统了,反正算法正确,AC. #include <stdio.h> #include <string.h> #include <limits.h> const int MAX_N = 5

poj 2914 Minimum Cut 无向图最小边割

题意: 求无向图的全局最小边割. 分析: stoer-wagner模板. 代码: //poj 2914 //sep9 #include <iostream> using namespace std; const int maxN=512; int g[maxN][maxN]; int b[maxN],dist[maxN]; int n,m; int Min_Cut_Phase(int ph,int &x,int &y) { int i,j,t; t=1; b[1]=ph; fo

POJ 2914 Minimum Cut 最小割图论

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 co

POJ 2914 - Minimum Cut - 全局最小割,Stoer-Wagner算法

题目大意:给定一个N个点.M条边的无向带权图,边的权值均为正整数.若要使它变成非连通图,需要移除的边总权值最小是多少? N≤500,图中不存在自环,但可能有重边(这里题意没交代清楚). Stoer-Wagner算法裸题.英文维基:https://en.wikipedia.org/wiki/Stoer%E2%80%93Wagner_algorithm 该算法的思想之一是:对于一个无向连通图,选定某两点s,t,以及该图的一个s-t割C,则"C是该图的全局最小割"是"C是s-t的最

POJ 2914 Minimum Cut (全局最小割)

[题目链接] http://poj.org/problem?id=2914 [题目大意] 求出一个最小边割集,使得图不连通 [题解] 利用stoerwagner算法直接求出全局最小割,即答案. [代码(递归)] #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int INF=0x3f3f3f3f; const int MAX_N=510; int v

POJ 2914 Minimum Cut 全局最小割

裸的全局最小割了吧 有重边,用邻接矩阵的时候要小心 #include<iostream> #include<cstdio> #include<bitset> #include<cstring> #define MOD 1000000007 #define maxn 509 using namespace std; int a[590][590],wage[maxn],in[maxn],vis[maxn]; int n,x,y,v; int find(int&

poj 2516 Minimum Cost(最小费最大流)

poj 2516 Minimum Cost Description Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his sale area there are N shopkeepers (marked from 1 to N) which stocks goods from him.Dearboy has M supply places (marked from 1 to

HDU 5452 Minimum Cut

Minimum Cut Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)Total Submission(s): 315    Accepted Submission(s): 120 Problem Description Given a simple unweighted graph G (an undirected graph containing no loops nor

POJ2914 Minimum Cut 最小割集

题目大意是,给定N个顶点,M条边,两个顶点之间可能有多条边,求至少删除多少条边才能将该图分成两个子图. 最小割集,典型的算法Stoer-Wagner,就是那篇论文,这里也就不复制过来了,只是用Prim求最大生成树时,更新的"边"不是普通意义上的边,而是顶点到所有已划分集合中的所有点的边权值和,这里要特别注意~ 直接贴代码~ #include <stdio.h> #include <vector> #include <math.h> #include