Dinic模板,bfs只进了1次
#include<bits/stdc++.h>
#define INF (1ll << 30)
typedef long long ll;
namespace IO {
inline ll read() {
ll ret = 0ll, f = 1ll;char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-') f = -f;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
ret = (ret << 1) + (ret << 3) + (ch ^ 48);
ch = getchar();
}
return ret * f;
}
void write(ll x) {
if (x < 0) putchar('-'), x = -x;
if (x > 9) write(x / 10);
putchar(x % 10 + '0');
}
}
using namespace IO;
using namespace std;
const int maxn = 200 + 5;
const int maxm = 5e3 + 5;
ll n, m, s, t;
ll tot = 1, head[maxn], to[maxm * 2], nxt[maxm * 2], val[maxm * 2];
void add(ll u, ll v, ll c) {
tot++;
nxt[tot] = head[u];
head[u] = tot;
to[tot] = v;
val[tot] = c;
}
bool vis[maxn];
ll cur[maxm * 2], dep[maxn];
bool bfs() {
queue<ll> q;
// memset(vis, 0, sizeof(vis));
// memset(dep, 0x7f, sizeof(dep));
// memcpy(cur, head, sizeof(cur));
for (int i = 1;i <= n;i++) vis[i] = 0, dep[i] = INF /*INFINITY*/, cur[i] = head[i];
q.push(s);
dep[s] = 0;
while (!q.empty()) {
ll u = q.front();q.pop();
vis[u] = 0;
for (ll i = head[u];i;i = nxt[i]) {
ll v = to[i];
if (dep[v] > dep[u] + 1 && val[i]) {
dep[v] = dep[u] + 1;
if (!vis[v]) {
vis[v] = 1;
q.push(v);
}
}
}
}
if (dep[t] != INF /*INFINITY*/) return false;
return true;
}
ll ans;
ll dfs(ll u, ll nflow) {
if (u == t) {
ans += nflow;
return nflow;
}
ll used = 0ll, rflow = 0ll;
for (int i = cur[u];i;i = nxt[i]) {
cur[u] = i;
ll v = to[i];
if (dep[v] == dep[u] + 1 && val[i]) {
// rflow = dfs(v, min(nflow - used, val[i]));
// if (!rflow) continue;
if (rflow = dfs(v, min(nflow - used, val[i])))
used += rflow;
val[i] -= rflow;
val[i ^ 1] += rflow;
if (used == nflow) break;
}
}
return used;
}
void Dinic() {
while (bfs()) dfs(s, INF /*INFINITY*/);
}
int main() {
n = read(), m = read(), s = read(), t = read();
for (int i = 1;i <= m;i++) {
ll u = read(), v = read(), c = read();
add(u, v, c), add(v, u, 0);
}
Dinic();
write(ans), puts("");
return 0;
}