rt,本蒟蒻没学过网络流,上 OI-Wiki 简单看了一下基本概念,然后写了个 dfs,感觉很奇怪但又莫名其妙的过了。
有没有大佬看看正确性有没有保证。
核心思路是从汇点开始反推,所以这里建的是反图。
#include <iostream>
#include <vector>
using namespace std;
int n, m, s, t, cnt;
bool vis[2000005];
// 用 vector 邻接表会超时
int nxt[2000005], head[2000005], to[2000005];
long long cap[2000005]; // 边的容量
void add(int u, int v, long long w) {
nxt[++cnt] = head[u];
head[u] = cnt;
to[cnt] = v;
cap[cnt] = w;
}
long long dfs(int x) {
if (x == s) return 0x3f3f3f3f3f3f3f3f;
long long ans = 0;
for (int i = head[x]; i; i = nxt[i]) {
if (vis[to[i]]) continue;
ans += min(cap[i], dfs(to[i]));
}
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> m >> s >> t;
int u, v;
long long w;
for (int i = 1; i <= m; i++) {
cin >> u >> v >> w;
add(v, u, w); // 建反图
}
cout << dfs(t);
return 0;
}