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

    最大流

    这是一道模板题。

    给定 n 个点,m 条边,给定每条边的容量,求从点 s 到点 t 的最大流。

    输入格式:
    第一行四个整数n,m,s,t。

    接下来的 m 行,每行三个整数u,v,c,表示从 u 到 v,流量为 c 的一条边。

    数据保证有 1≤n≤100,1≤m≤5000,0c23110≤c≤2^{​31}−1

    输出格式:
    输出点 s 到点 t 的最大流。

    输入样例:

    
    7 14 1 7
    1 2 5
    1 3 6
    1 4 5
    2 3 2
    2 5 3
    3 2 2
    3 4 3
    3 5 3
    3 6 7
    4 6 5
    5 6 1
    6 5 1
    5 7 8
    6 7 7
    

    输出样例:
    14

    
    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    const int maxn = 1e5+10;      
    const int inf = 0x3f3f3f3f;
    int n,m,s,t,tol,head[maxn],dep[maxn];                                       
    struct Edge
    {
        int v,w,nxt;
    }E[maxn];
    void add_edge(int u,int v,int w)
    {
        E[tol] = Edge{v,w,head[u]};
        head[u] = tol++;
    }
    bool Bfs()
    {
        memset(dep,0, sizeof(dep));
        queue<int>q;
        while(!q.empty())
            q.pop();
        q.push(s);
        dep[s] = 1;
        while(!q.empty())
        {
            int u = q.front();
            q.pop();
            for(int i = head[u];i != -1;i = E[i].nxt)
            {
                if(E[i].w && !dep[E[i].v])
                {
                    dep[E[i].v] = dep[u] + 1;
                    q.push(E[i].v);
                    if(E[i].v == t)
                        return true;
                }
            }
        }
        return false;
    }
    int Dfs(int u,int f)
    {
        if(u == t)
            return f;
        int used = 0,d = 0;
        for(int i = head[u];i != -1;i = E[i].nxt)
        {
            if(dep[u] == dep[E[i].v] - 1 && E[i].w)
            {
                if((d = Dfs(E[i].v,min(f - used,E[i].w))))
                {
                    used += d;
                    E[i].w -= d;
                    E[i^1].w += d;
                }
            }
        }
        if(!used)
            dep[u] = 0;
        return used;
    }
    int Dinic()
    {
        int max_flow = 0,d;
        while(Bfs())
        {
            while((d = Dfs(s,inf)))
                max_flow += d;
        }
        return max_flow;
    }
    signed main()
    {
        //freopen("in","r",stdin);
        ios::sync_with_stdio(false);
        cin.tie(0);
        memset(head,-1, sizeof(head));
        cin >> n >> m >> s >> t;
        int u,v,c;
        for(int i = 0;i < m; i++)
        {
            cin >> u >> v >> c;
            add_edge(u,v,c);
            add_edge(v,u,0);
        }
        cout << Dinic() << endl;
        return 0;
    }
    
    
  • 相关阅读:
    ⑬linux基础命令 wget
    爱情的诗·21~25节
    爱情的诗·16~20节
    爱情的诗·11~15节
    人生的诗·406~410节
    唐诗宋词学习·126~130节
    爱情的诗·6~10节
    人生的诗·401~405节
    唐诗宋词学习·121~125节
    唐诗宋词学习·100~105节
  • 原文地址:https://www.cnblogs.com/xcfxcf/p/12301649.html
Copyright © 2011-2022 走看看