zoukankan      html  css  js  c++  java
  • poj2914

    无向图的最小割,模板题

    用stoer_wagner算法

    每次从0点开始,进行一种类似于最大生成树的操作,唯一与最大生成树的区别就是在选择把哪个点加进来的时候,不是根据连到它的边的长度,而是根据它到树的所有边的长度和。然后记录最后两个进树的点合并(缩点),并用这两点间的割来更新最小值。然后不断重复此操作(生成树、缩点、最小值),直到所有点都缩为1点。

    正确性还没太想明白。

    View Code
    #include <iostream>
    #include
    <cstdlib>
    #include
    <cstring>
    #include
    <cstdio>
    using namespace std;

    #define maxn 505
    #define inf 0x3f3f3f3f

    int n, m;
    int map[maxn][maxn];
    bool combine[maxn];
    int s, e;
    bool vis[maxn];
    int w[maxn];
    int mincut;

    void input()
    {
    for (int i = 0; i < m; i++)
    {
    int a, b, c;
    scanf(
    "%d%d%d", &a, &b, &c);
    map[a][b]
    += c;
    map[b][a]
    += c;
    }
    }

    void search()
    {
    memset(vis,
    0, sizeof(vis));
    memset(w,
    0, sizeof(w));
    while (true)
    {
    int temp = -inf;
    int x = -1;
    for (int i = 0; i < n; i++)
    if (!combine[i] && !vis[i] && w[i] > temp)
    {
    temp
    = w[i];
    x
    = i;
    }
    if (x == -1)
    return;
    s
    = e;
    e
    = x;
    mincut
    = temp;
    vis[x]
    = true;
    for (int i = 0; i < n; i++)
    if (!combine[i] && !vis[i])
    w[i]
    += map[x][i];
    }
    }

    int stoer_wagner()
    {
    int ret = inf;
    for (int i = 0; i < n - 1; i++)
    {
    search();
    ret
    = min(ret, mincut);
    combine[e]
    = true;
    for (int j = 0; j < n; j++)
    if (!combine[j])
    {
    map[s][j]
    += map[e][j];
    map[j][s]
    += map[j][e];
    }
    }
    return ret;
    }

    int main()
    {
    //freopen("t.txt", "r", stdin);
    while (scanf("%d%d", &n, &m) != EOF)
    {
    memset(map,
    0, sizeof(map));
    input();
    memset(combine,
    0, sizeof(combine));
    printf(
    "%d\n", stoer_wagner());
    }
    return 0;
    }
  • 相关阅读:
    前端技术-PS切图
    Html5资料整理
    Html5知识体系
    Html知识体系
    C语言知识结构
    ASP.NET知识结构
    src和href的区别
    Ajax的简单使用
    学习理论
    求模运算法则
  • 原文地址:https://www.cnblogs.com/rainydays/p/2175471.html
Copyright © 2011-2022 走看看