模板网络最大流

Posted xuyixuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板网络最大流相关的知识,希望对你有一定的参考价值。

题意简述

给出一个网络图,以及其源点和汇点,求出其网络最大流。

代码

#include <queue> 
#include <cstdio>
#include <cstring>
#include <algorithm>
int n, m, s, t, cnt = 1, u, v, w, ans;
int h[10010], nxt[200010], va[200010], to[200010], dep[10010], lst[10010];
inline void add_edge(const int& u, const int& v, const int& w)

    to[++cnt] = v;
    va[cnt] = w;
    nxt[cnt] = h[u];
    h[u] = cnt;

bool bfs()

    std::queue <int> q;
    memset(dep, 0, sizeof(dep));
    q.push(t);
    dep[t] = 1;
    while (!q.empty())
    
        int u = q.front();
        q.pop();
        for (register int i = h[u]; i; i = nxt[i])
            if (va[i ^ 1] && !dep[to[i]])
            
                dep[to[i]] = dep[u] + 1;
                if (to[i] == s) return 1;
                q.push(to[i]);
            
    
    return 0;

int dfs(const int& u, int flow)

    int ss = 0;
    if (u == t) return flow;
    for (int& i = lst[u]; i; i = nxt[i])
        if (dep[to[i]] == dep[u] - 1 && va[i])
        
            int tmp = dfs(to[i], std::min(flow, va[i]));
            va[i] -= tmp;
            va[i ^ 1] += tmp;
            flow -= tmp;
            ss += tmp;
            if (!flow) return ss;
        
    if (!ss) dep[u] = 0;
    return ss;

int main()

    scanf("%d%d%d%d", &n, &m, &s, &t);
    for (register int i = 1; i <= m; ++i)
    
        scanf("%d%d%d", &u, &v, &w);
        add_edge(u, v, w);
        add_edge(v, u, 0);
    
    while (bfs())
    
        for (register int i = 1; i <= n; ++i) lst[i] = h[i];
        ans += dfs(s, 0x7fffffff);
    
    printf("%d\n", ans);

以上是关于模板网络最大流的主要内容,如果未能解决你的问题,请参考以下文章

网络流 最大流SAPkuangbin模板

[loj#101] 最大流 网络流模板

二分图/网络流/最小割/最大流/最小费用最大流等等 模板

模板 - 网络流 - 最大流

最大流模板

网络流最大流模板