Maximum flow and constraints dinic template
// MaxFlow based and AtCoder Library, single class, no namespace, no private variables, compatible
// with C++11 Reference: <https://atcoder.github.io/ac-library/production/document_ja/maxflow.html>
template <class Cap> struct mf_graph {
    struct simple_queue_int {
        std::vector<int> payload;
        int pos = 0;
        void reserve(int n) { payload.reserve(n); }
        int size() const { return int(payload.size()) - pos; }
        bool empty() const { return pos == int(payload.size()); }
        void push(const int &t) { payload.push_back(t); }
        int &front() { return payload[pos]; }
        void clear() {
            payload.clear();
            pos = 0;
        }
        void pop() { pos++; }
    };
 
    mf_graph() : _n(0) {}
    mf_graph(int n) : _n(n), g(n) {}
 
    int add_edge(int from, int to, Cap cap) {
        assert(0 <= from && from < _n);
        assert(0 <= to && to < _n);
        assert(0 <= cap);
        int m = int(pos.size());
        pos.push_back({from, int(g[from].size())});
        int from_id = int(g[from].size());
        int to_id = int(g[to].size());
        if (from == to) to_id++;
        g[from].push_back(_edge{to, to_id, cap});
        g[to].push_back(_edge{from, from_id, 0});
        return m;
    }
 
    struct edge {
        int from, to;
        Cap cap, flow;
    };
 
    edge get_edge(int i) {
        int m = int(pos.size());
        assert(0 <= i && i < m);
        auto _e = g[pos[i].first][pos[i].second];
        auto _re = g[_e.to][_e.rev];
        return edge{pos[i].first, _e.to, _e.cap + _re.cap, _re.cap};
    }
    std::vector<edge> edges() {
        int m = int(pos.size());
        std::vector<edge> result;
        for (int i = 0; i < m; i++) { result.push_back(get_edge(i)); }
        return result;
    }
    void change_edge(int i, Cap new_cap, Cap new_flow) {
        int m = int(pos.size());
        assert(0 <= i && i < m);
        assert(0 <= new_flow && new_flow <= new_cap);
        auto &_e = g[pos[i].first][pos[i].second];
        auto &_re = g[_e.to][_e.rev];
        _e.cap = new_cap - new_flow;
        _re.cap = new_flow;
    }
 
    std::vector<int> level, iter;
    simple_queue_int que;
 
    void _bfs(int s, int t) {
        std::fill(level.begin(), level.end(), -1);
        level[s] = 0;
        que.clear();
        que.push(s);
        while (!que.empty()) {
            int v = que.front();
            que.pop();
            for (auto e : g[v]) {
                if (e.cap == 0 || level[e.to] >= 0) continue;
                level[e.to] = level[v] + 1;
                if (e.to == t) return;
                que.push(e.to);
            }
        }
    }
    Cap _dfs(int v, int s, Cap up) {
        if (v == s) return up;
        Cap res = 0;
        int level_v = level[v];
        for (int &i = iter[v]; i < int(g[v].size()); i++) {
            _edge &e = g[v][i];
            if (level_v <= level[e.to] || g[e.to][e.rev].cap == 0) continue;
            Cap d = _dfs(e.to, s, std::min(up - res, g[e.to][e.rev].cap));
            if (d <= 0) continue;
            g[v][i].cap += d;
            g[e.to][e.rev].cap -= d;
            res += d;
            if (res == up) return res;
        }
        level[v] = _n;
        return res;
    }
 
    Cap flow(int s, int t) { return flow(s, t, std::numeric_limits<Cap>::max()); }
    Cap flow(int s, int t, Cap flow_limit) {
        assert(0 <= s && s < _n);
        assert(0 <= t && t < _n);
        assert(s != t);
 
        level.assign(_n, 0), iter.assign(_n, 0);
        que.clear();
 
        Cap flow = 0;
        while (flow < flow_limit) {
            _bfs(s, t);
            if (level[t] == -1) break;
            std::fill(iter.begin(), iter.end(), 0);
            Cap f = _dfs(t, s, flow_limit - flow);
            if (!f) break;
            flow += f;
        }
        return flow;
    }
 
    std::vector<bool> min_cut(int s) {
        std::vector<bool> visited(_n);
        simple_queue_int que;
        que.push(s);
        while (!que.empty()) {
            int p = que.front();
            que.pop();
            visited[p] = true;
            for (auto e : g[p]) {
                if (e.cap && !visited[e.to]) {
                    visited[e.to] = true;
                    que.push(e.to);
                }
            }
        }
        return visited;
    }
 
    void dump_graphviz(std::string filename = "maxflow") const {
        std::ofstream ss(filename + ".DOT");
        ss << "digraph{\n";
        for (int i = 0; i < _n; i++) {
            for (const auto &e : g[i]) {
                if (e.cap > 0) ss << i << "->" << e.to << "[label=" << e.cap << "];\n";
            }
        }
        ss << "}\n";
        ss.close();
        return;
    }
 
    int _n;
    struct _edge {
        int to, rev;
        Cap cap;
    };
    std::vector<std::pair<int, int>> pos;
    std::vector<std::vector<_edge>> g;
};
 
 
// MaxFlow with lower bound
// https://snuke.hatenablog.com/entry/2016/07/10/043918
// https://ei1333.github.io/library/graph/flow/maxflow-lower-bound.cpp
// flush(s, t): Calculate maxflow (if solution exists), -1 (otherwise)
template <typename Cap> struct MaxFlowLowerBound {
    using Maxflow = mf_graph<Cap>;
    int N;
    Maxflow mf;
    std::vector<Cap> in;
    MaxFlowLowerBound(int N = 0) : N(N), mf(N + 2), in(N) {}
 
    std::vector<Cap> cap_lo_info;
 
    int add_edge(int from, int to, Cap cap_lo, Cap cap_hi) {
        assert(0 <= from and from < N);
        assert(0 <= to and to < N);
        assert(0 <= cap_lo and cap_lo <= cap_hi);
        in[from] -= cap_lo;
        in[to] += cap_lo;
        cap_lo_info.push_back(cap_lo);
        return mf.add_edge(from, to, cap_hi - cap_lo);
    }
 
    Cap flow(int s, int t) {
        assert(s != t);
        assert(0 <= s and s < N);
        assert(0 <= t and t < N);
        Cap sum = 0;
        for (int i = 0; i < N; i++) {
            if (in[i] > 0) mf.add_edge(N, i, in[i]), sum += in[i];
            if (in[i] < 0) mf.add_edge(i, N + 1, -in[i]);
        }
        mf.add_edge(t, s, std::numeric_limits<Cap>::max());
        if (mf.flow(N, N + 1) < sum) return -1;
        return mf.flow(s, t);
    }
 
    typename Maxflow::edge get_edge(int i) {
        auto ret = mf.get_edge(i);
        ret.cap += cap_lo_info.at(i);
        ret.flow += cap_lo_info.at(i);
        return ret;
    }
 
    std::vector<typename Maxflow::edge> edges() {
        std::vector<typename Maxflow::edge> result;
        for (int i = 0; i < int(cap_lo_info.size()); ++i) result.push_back(get_edge(i));
        return result;
    }
};

Comments

  1. 1 month ago
    2026-8-13 20:10:25

    Logging in is always such a hassle with other sites but this one actually gets it right. Fast loading, secure connection, and I never get stuck on some weird captcha loop. It just works smoothly every single time I open it up. becriclogin

  2. 1 month ago
    2026-8-13 20:10:41

    Brazilian fans have been asking for a trustworthy hub and this platform truly steps up to the plate. Quick bet placements and transparent game results keep the trust strong. Enjoyed every minute of my first session. brwaybet

  3. 1 month ago
    2026-8-13 20:11:02

    I was hesitant at first but the registration process took less than two minutes and I was playing right away. The welcome bonus was applied instantly and the game variety covers everything from classic table titles to modern video reels. Payments are secure and I got my first payout within hours. Truly a seamless experience. solcasinologin

  4. 3 weeks ago
    2026-8-26 7:34:24

    [6323]baji7777 অফিসিয়াল লগইন | সেরা ক্যাসিনো বোনাস ও দ্রুত পেমেন্ট,baji7777 অ্যাপ ডাউনলোড করে উপভোগ করুন সেরা অনলাইন ক্যাসিনো বোনাস এবং দ্রুত বিকাশ পেমেন্ট গেটওয়ে। আজই যোগ দিয়ে স্লট গেমের রোমাঞ্চ শুরু করুন। visit: baji7777

Send Comment Edit Comment


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
Previous
Next