zoukankan      html  css  js  c++  java
  • King of Destruction HDU

    求无向图的最小割

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

    #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
    ", a)
    #define plld(a) printf("%lld
    ", a)
    #define pc(a) printf("%c
    ", a)
    #define ps(a) printf("%s
    ", 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;
    }
    自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
  • 相关阅读:
    Eclipse自动换行插件
    JAVA中super与this的区别
    外网访问PG数据库,如何赋予IP访问权限
    PostgreSQL环境变量与psql命令的替代作用
    \l 的使用
    一次生成任意多行数据的语句
    equals与==的区别
    PostgreSQL 名词理解EXPLAIN VERBOSE
    PG坑爹的数组定义
    【收藏】常用的ftp命令
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/10021459.html
Copyright © 2011-2022 走看看