zoukankan      html  css  js  c++  java
  • P3376 【模板】网络最大流 题解 网络流入门题

    题目链接:https://www.luogu.com.cn/problem/P3376

    思路完全参照自 SYCstudio 的这篇博客:https://www.cnblogs.com/SYCstudio/p/7260613.html

    实现代码(dinic实现):

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 10010, maxm = 200020, INF = (1<<29);
    struct Edge {
        int u, v, w, nxt;
        Edge() {};
        Edge(int _u, int _v, int _w, int _nxt) {
            u = _u; v = _v; w = _w; nxt = _nxt;
        }
    } edge[maxm];
    int n, m, s, t, head[maxn], ecnt;
    void init() {
        ecnt = 0;
        memset(head, -1, sizeof(int)*(n+1));
    }
    void addedge(int u, int v, int w) {
        edge[ecnt] = Edge(u, v, w, head[u]); head[u] = ecnt ++;
        edge[ecnt] = Edge(v, u, 0, head[v]); head[v] = ecnt ++;
    }
    queue<int> que;
    int dep[maxn], cur[maxn];
    bool bfs() {
        while (!que.empty()) que.pop();
        memset(dep, 0, sizeof(int)*(n+1));
        dep[s] = 1;
        que.push(s);
        while (!que.empty()) {
            int u = que.front();
            que.pop();
            for (int i = head[u]; i != -1; i = edge[i].nxt) {
                int v = edge[i].v, w = edge[i].w;
                if (dep[v] == 0 && w > 0) {
                    dep[v] = dep[u] + 1;
                    que.push(v);
                }
            }
        }
        return dep[t];
    }
    int dfs(int u, int flow) {
        if (u == t) return flow;
        for (int &i = cur[u]; i != -1; i = edge[i].nxt) {
            int v = edge[i].v, w = edge[i].w;
            if (dep[v] == dep[u]+1 && w > 0) {
                int f = dfs(v, min(w, flow));
                if (f > 0) {
                    edge[i].w -= f;
                    edge[i^1].w += f;
                    return f;
                }
            }
        }
        return 0;
    }
    int dinic() {
        int ans = 0;
        while (bfs()) {
            for (int i = 1; i <= n; i ++) cur[i] = head[i];
            while (int d = dfs(s, INF)) ans += d;
        }
        return ans;
    }
    int main() {
        cin >> n >> m >> s >> t;
        init();
        while (m --) {
            int u, v, w;
            cin >> u >> v >> w;
            addedge(u, v, w);
        }
        cout << dinic() << endl;
        return 0;
    }
    
  • 相关阅读:
    【linux 爱好者群】程序猿的那些聊天记录
    开发技巧记录
    tcmalloc 内存分析
    mktime很慢就自己去实现一个吧
    bash变量常用技巧
    文本处理sed常用操作
    【TED】如何掌握你的自由时间
    vim粘贴代码问题
    工作方式的反思-20170319
    【one day one linux】find 用法详解小记
  • 原文地址:https://www.cnblogs.com/quanjun/p/12907348.html
Copyright © 2011-2022 走看看