zoukankan      html  css  js  c++  java
  • 网络最大流最短增广路Dinic算法模板

    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<vector>
    #include<queue>
    #include<algorithm>
    using namespace std;
    
    
    const int maxn = 30000 + 10;
    const int INF = 0x7FFFFFFF;
    struct Edge
    {
        int from, to, cap, flow;
        Edge(int u, int v, int c, int f) :from(u), to(v), cap(c), flow(f){}
    };
    vector<Edge>edges;
    vector<int>G[maxn];
    bool vis[maxn];
    int d[maxn];
    int cur[maxn];
    int n, m, s, t;
    
    void init()
    {
        for (int i = 0; i < maxn; i++)
            G[i].clear();
        edges.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));
        int w = edges.size();
        G[from].push_back(w - 2);
        G[to].push_back(w - 1);
    }
    bool BFS()
    {
        memset(vis, 0, sizeof(vis));
        queue<int>Q;
        Q.push(s);
        d[s] = 0;
        vis[s] = 1;
        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] = 1;
                    d[e.to] = d[x] + 1;
                    Q.push(e.to);
                }
            }
        }
        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)
            {
                edges[G[x][i]].flow+=f;
                edges[G[x][i] ^ 1].flow-=f;
                flow+=f;
                a-=f;
                if(a==0) break;
            }
        }
        if(!flow) d[x] = -1;
        return flow;
    }
    int dinic(int s, int t)
    {
        int flow = 0;
        while (BFS())
        {
            memset(cur, 0, sizeof(cur));
            flow += DFS(s, INF);
        }
        return flow;
    }
    
    //输入输出
    int main()
    {
        int T,ii;
        scanf("%d",&T);
        for(ii=1;ii<=T;ii++)
        {
    
            /*初始化*/
            edges.clear();
            for(int i=0;i<maxn;i++) G[i].clear();
            /*如果想要多次求网络流,求完一次后,先把每条弧的流量清空*/
    
            int mm;
            scanf("%d%d",&n,&mm);
            s=1;t=n;//设置源点和汇点
            while(mm--)
            {
                int uu,vv,cc;
                scanf("%d%d%d",&uu,&vv,&cc);
                AddEdge(uu,vv,cc);
            }
            printf("Case %d: %d
    ",ii,dinic(s,t));
        }
        return 0;
    }
  • 相关阅读:
    一行代码搞定Dubbo接口调用
    测试周期内测试进度报告规范
    jq 一个强悍的json格式化查看工具
    浅析Docker容器的应用场景
    HDU 4432 Sum of divisors (水题,进制转换)
    HDU 4431 Mahjong (DFS,暴力枚举,剪枝)
    CodeForces 589B Layer Cake (暴力)
    CodeForces 589J Cleaner Robot (DFS,或BFS)
    CodeForces 589I Lottery (暴力,水题)
    CodeForces 589D Boulevard (数学,相遇)
  • 原文地址:https://www.cnblogs.com/zufezzt/p/4642754.html
Copyright © 2011-2022 走看看