King of Destruction HDU - 3002 && HDU - 3691(全局最小割)

求无向图的最小割

有没有源点都一样,不影响

 

#include <iostream>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <map>
#include <cctype>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <bitset>
#define rap(i, a, n) for(int i=a; i<=n; i++)
#define rep(i, a, n) for(int i=a; i<n; i++)
#define lap(i, a, n) for(int i=n; i>=a; i--)
#define lep(i, a, n) for(int i=n; i>a; i--)
#define rd(a) scanf("%d", &a)
#define rlld(a) scanf("%lld", &a)
#define rc(a) scanf("%c", &a)
#define rs(a) scanf("%s", a)
#define rb(a) scanf("%lf", &a)
#define rf(a) scanf("%f", &a)
#define pd(a) printf("%d\n", a)
#define plld(a) printf("%lld\n", a)
#define pc(a) printf("%c\n", a)
#define ps(a) printf("%s\n", a)
#define MOD 2018
#define LL long long
#define ULL unsigned long long
#define Pair pair<int, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define _  ios_base::sync_with_stdio(0),cin.tie(0)
//freopen("1.txt", "r", stdin);
using namespace std;
const int maxn = 105, INF = 0x7fffffff;

int n, m;
int way[maxn][maxn], d[maxn], bin[maxn];
bool vis[maxn];

int contract(int &s, int &t)
{
    mem(vis, false);
    mem(d, 0);
    int k, maxc, ans;
    rap(i, 1, n)
    {
        k = -1, maxc = -INF;
        rap(j, 1, n)
            if(!bin[j] && !vis[j] && d[j] > maxc)
                k = j, maxc = d[j];
        if(k == -1) return ans;
        s = t, t = k, ans = maxc;
        vis[k] = true;
        rap(j, 1, n)
            if(!bin[j] && !vis[j])
                d[j] += way[k][j];
    }
    return ans;
}

int SW()
{
    int mincut = INF, ans, s, t;
    rep(i, 1, n)
    {
        ans = contract(s, t);
        bin[t] = 1;
        mincut = min(ans, mincut);
        if(mincut == 0) return 0;
        rap(j, 1, n)
            if(!bin[j])
                way[s][j] = (way[j][s] += way[j][t]);
    }
    return mincut;
}

int main()
{
    while(scanf("%d%d", &n, &m) != EOF)
    {
        mem(way, 0);
        mem(bin, 0);
        int u, v, w;
        rap(i, 1, m)
        {
            rd(u), rd(v), rd(w);
            u++, v++;
            way[u][v] += w;
            way[v][u] += w;
        }
        cout << SW() << endl;

    }

    return 0;
}

 

posted @ 2018-11-26 17:07  WTSRUVF  阅读(199)  评论(0编辑  收藏  举报