zoukankan      html  css  js  c++  java
  • 最大流

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <string>
    #include <set>
    #include <queue>
    #include <map>
    #include <sstream>
    #include <cstdio>
    #include <cstring>
    #include <numeric>
    #include <cmath>
    #include <iomanip>
    #include <deque>
    #include <bitset>
    #include <cassert>
    //#include <unordered_set>
    //#include <unordered_map>
    #define ll              long long
    #define pii             pair<int, int>
    #define rep(i,a,b)      for(int  i=a;i<=b;i++)
    #define dec(i,a,b)      for(int  i=a;i>=b;i--)
    #define forn(i, n)      for(int i = 0; i < int(n); i++)
    using namespace std;
    int dir[4][2] = { { 1,0 },{ 0,1 } ,{ 0,-1 },{ -1,0 } };
    const long long INF = 0x7f7f7f7f7f7f7f7f;
    const int inf = 0x3f3f3f3f;
    const double pi = acos(-1.0);
    const double eps = 1e-6;
    const int mod = 998244353;
    
    inline int read()
    {
        int x = 0; bool f = true; char c = getchar();
        while (c < '0' || c > '9') { if (c == '-') f = false; c = getchar(); }
        while (c >= '0' && c <= '9') x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
        return f ? x : -x;
    }
    inline ll gcd(ll m, ll n)
    {
        return n == 0 ? m : gcd(n, m % n);
    }
    void exgcd(ll A, ll B, ll& x, ll& y)
    {
        if (B) exgcd(B, A % B, y, x), y -= A / B * x; else x = 1, y = 0;
    }
    inline ll qpow(ll x, ll n) {
        int r = 1;
        while (n > 0) {
            if (n & 1) r = 1ll * r * x %mod;
            n >>= 1; x = 1ll * x * x %mod;
        }
        return r;
    }
    inline int inv(int x) {
        return qpow(x, mod - 2);
    }
    ll lcm(ll a, ll b)
    {
        return a * b / gcd(a, b);
    }
    /**********************************************************/
    const int N = 2e3 + 5;
    
    const int maxn = 200 + 5;
    
    struct Edge
    {
        int from, to, cap, flow;
        Edge() {}
        Edge(int f, int t, int c, int flow) :from(f), to(t), cap(c), flow(flow) {}
    };
    
    struct Dinic
    {
        int n, m, s, t;
        vector<Edge> edges;
        vector<int> G[maxn];
        bool vis[maxn];
        int cur[maxn];
        int d[maxn];
    
        void init(int n, int s, int t)
        {
            this->n = n, this->s = s, this->t = t;
            edges.clear();
            for (int i = 1; i <= n; i++) G[i].clear();
        }
    
        void AddEdge(int from, int to, int cap)
        {
            edges.push_back(Edge(from, to, cap, 0));
            edges.push_back(Edge(to, from, 0, 0));
            m = edges.size();
            G[from].push_back(m - 2);
            G[to].push_back(m - 1);
        }
    
        bool BFS()
        {
            memset(vis, 0, sizeof(vis));
            queue<int> Q;
            d[s] = 0;
            Q.push(s);
            vis[s] = true;
            while (!Q.empty())
            {
                int x = Q.front(); Q.pop();
                for (int i = 0; i < G[x].size(); i++)
                {
                    Edge& e = edges[G[x][i]];
                    if (!vis[e.to] && e.cap > e.flow)
                    {
                        vis[e.to] = true;
                        Q.push(e.to);
                        d[e.to] = 1 + d[x];
                    }
                }
            }
            return vis[t];
        }
    
        int DFS(int x, int a)
        {
            if (x == t || a == 0) 
                return a;
            int flow = 0, f;
            for (int& i = cur[x]; i < G[x].size(); i++)
            {
                Edge& e = edges[G[x][i]];
                if (d[x] + 1 == d[e.to] && (f = DFS(e.to, min(a, e.cap - e.flow))) > 0)
                {
                    e.flow += f;
                    edges[G[x][i] ^ 1].flow -= f;
                    flow += f;
                    a -= f;
                    if (a == 0) break;
                }
            }
            return flow;
        }
    
        int Maxflow()
        {
            int flow = 0;
            while (BFS())
            {
                memset(cur, 0, sizeof(cur));
                flow += DFS(s, INF);
            }
            return flow;
        }
    }DC;
    
    int main()
    {
        int n, m;
        while (scanf("%d%d", &m, &n) == 2)
        {
            DC.init(n, 1, n);
            while (m--)
            {
                int u, v, w;
                scanf("%d%d%d", &u, &v, &w);
                DC.AddEdge(u, v, w);
            }
            printf("%d
    ", DC.Maxflow());
        }
        return 0;
    }
  • 相关阅读:
    log4j不生成日志文件的问题
    前端得到或者改变组件的值
    取list的值
    idea Library XXXXXXXX has broken classes paths
    session.save()返回值问题
    Intellij Error:Cannot build Artifact 'XXX:war exploded' because it is included into a circular dependency
    shell小结
    python操作rabbitMQ小结
    python+rabbitMQ实现生产者和消费者模式
    Python操作rabbitmq消息队列持久化
  • 原文地址:https://www.cnblogs.com/dealer/p/13490659.html
Copyright © 2011-2022 走看看