代码如下:
#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