一些模板
\(1.\) 最大流
点击查看代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int inf = 1e9;
const int N = 2e5 + 100;
int n, m, s, t, head[N], tot = 1, dep[N], cur[N];
struct Node {
int to, nxt, w;
} e[N];
void add(int u, int v, int w) {
e[++tot] = {v, head[u], w};
head[u] = tot;
}
bool bfs() {
queue<int> q;
q.push(s);
memset(dep, 0, sizeof(dep));
dep[s] = 1;
cur[s] = head[s];
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (e[i].w && !dep[v]) {
dep[v] = dep[u] + 1;
cur[v] = head[v];
q.push(v);
if (v == t) {
return 1;
}
}
}
}
return 0;
}
int dfs(int u, int p) {
if (u == t) {
return p;
}
int r = p;
for (int i = cur[u]; i && r; i = e[i].nxt) {
cur[u] = i;
int v = e[i].to;
if (e[i].w && dep[v] == dep[u] + 1) {
int k = dfs(v, min(r, e[i].w));
if (!k) {
dep[v] = 0;
}
e[i].w -= k;
e[i ^ 1].w += k;
r -= k;
}
}
return p - r;
}
signed main() {
cin >> n >> m >> s >> t;
for (int i = 1, u, v, w; i <= m; i++) {
cin >> u >> v >> w;
add(u, v, w);
add(v, u, 0);
}
int ans = 0, sum = 0;
while (bfs()) {
while (ans = dfs(s, inf)) {
sum += ans;
}
}
cout << sum << '\n';
return 0;
}
...

浙公网安备 33010602011771号