Subtask #1 RE 求调
查看原帖
Subtask #1 RE 求调
1198768
qazsedcrfvgyhnujijn楼主2024/7/8 08:46

代码如下:

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 4003, M = 400003, INF = 0x7f7f7f7f;
int n, m, s, t;

struct Edge {
    int to, nxt, cap;
    Edge(int v = 0, int w = 0, int c = 0) : to(v), nxt(w), cap(c) {}
};

Edge e[M << 2];
int head[N + 1], tot = 1;

void addedge(int u, int v, int cap) { e[++tot] = Edge(v, head[u], cap), head[u] = tot; }
void link(int u, int v, int cap) { addedge(u, v, cap), addedge(v, u, 0); }

int ht[N + 1], ex[N + 1], gap[N];
stack <int> buc[N];
int lev;

int push(int u) {
    bool init = u == s;
    for (int i = head[u], v = e[i].to, w = e[i].cap; i; i = e[i].nxt, v = e[i].to, w = e[i].cap) {
        if (!w || (init == false && ht[u] != ht[v] + 1) || ht[v] == INF) continue;
        int k = init ? w : min(w, ex[u]);
        if (v != s && v != t && !ex[v]) buc[ht[v]].push(v), lev = max(lev, ht[v]);
        ex[u] -= k, ex[v] += k, e[i].cap -= k, e[i ^ 1].cap += k;
        if (!ex[u]) return 0;
    }
    return 1;
}
void relabel(int u) {
    ht[u] = INF;
    for (int i = head[u]; i; i = e[i].nxt)
        if (e[i].cap) ht[u] = min(ht[u], ht[e[i].to]);
    if (++ht[u] < n)
        buc[ht[u]].push(u), lev = max(lev, ht[u]), ++gap[ht[u]];
}
bool bfs_init() {
    memset(ht, 0x7f, sizeof ht);
    queue<int> q;
    q.push(t), ht[t] = 0;
    while (q.size()) {
        int u = q.front();
        q.pop();
        for (int i = head[u]; i; i = e[i].nxt)
            if (e[i ^ 1].cap && ht[e[i].to] > ht[u] + 1)
                ht[e[i].to] = ht[u] + 1, q.push(e[i].to);
    }
    return ht[s] != INF;
}
int select() {
    while (~lev && buc[lev].empty()) --lev;
    return lev == -1 ? 0 : buc[lev].top();
}
int hlpp() {
    if (!bfs_init()) return 0;
    for (int i = 1; i <= n; i++)
        if (ht[i] != INF) ++gap[ht[i]];
    ht[s] = n;
    push(s);
    for (int u; u = select();) {
        buc[lev].pop();
        if (push(u)) {
            if (!--gap[ht[u]])
                for (int i = 1; i <= n; i++)
                    if (i != s && ht[i] > ht[u] && ht[i] < n + 1)
                        ht[i] = n + 1;
            relabel(u);
        }
    }
    return ex[t];
}
signed main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> n >> m >> s >> t;
    for (int i = 1, u, v, w; i <= m; i++)
        cin >> u >> v >> w, link(u, v, w);
    cout << hlpp() << endl;
    return 0;
}

只有 Subtask #1 RE

2024/7/8 08:46
加载中...