板子集合
图论
网络流
网络流模板:
最大流:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 550, M = N * N, inf = 0x3f3f3f3f3f3f3f3f;
struct Dinic{
int n, S, T;
struct Edge{
int nxt, to, r, fl;
Edge() {}
Edge(int _nxt, int _to, int _r)
: nxt(_nxt), to(_to), r(_r), fl(0) {}
} e[M];
int h[N], cnt, nw[N];
void add(int u, int v, int c) {
e[cnt] = Edge(h[u], v, c), h[u] = cnt++;
e[cnt] = Edge(h[v], u, 0), h[v] = cnt++;
return;
}
void init(int _n) {
n = _n, cnt = 0, S = n + 1, T = n + 2;
memset(h, -1, sizeof h);
return;
}
int d[N];
bool bfs() {
queue<int> q;
for (int i = 1; i <= n; ++i) d[i] = 0;
d[S] = 1, d[T] = 0;
q.push(S);
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = h[u]; ~i; i = e[i].nxt) {
int v = e[i].to;
if (d[v] || e[i].r <= e[i].fl) continue;
d[v] = d[u] + 1, q.push(v);
}
}
return (d[T] > 0);
}
int dfs(int u, int lim) {
if (u == T || lim == 0) return lim;
int ret = 0;
for (int i = nw[u]; ~i; i = nw[u]) {
int v = e[i].to, Limie;
if (d[v] != d[u] + 1) {
nw[u] = e[i].nxt;
continue;
}
Limie = dfs(v, min(lim - ret, e[i].r - e[i].fl));
ret += Limie, e[i].fl += Limie, e[i ^ 1].fl -= Limie;
if (ret == lim) break;
nw[u] = e[i].nxt;
}
return ret;
}
int dinic() {
for (int i = 0; i < cnt; ++i) e[i].fl = 0;
int res = 0;
while (bfs()) {
for (int i = 1; i <= n; ++i) nw[i] = h[i];
nw[S] = h[S], nw[T] = h[T];
res += dfs(S, inf);
}
return res;
}
} zq;
signed main() {
return 0;
}
费用流
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 20020, M = N * 8, inf = 0x3f3f3f3f3f3f3f3f;
struct Dinic{
int n, S, T, res;
struct Edge{
int nxt, to, r, fl, w;
Edge() {}
Edge(int _nxt, int _to, int _r, int _w)
: nxt(_nxt), to(_to), r(_r), fl(0) , w(_w){}
} e[M];
int h[N], cnt, nw[N];
void add(int u, int v, int c, int w) {
e[cnt] = Edge(h[u], v, c, w), h[u] = cnt++;
e[cnt] = Edge(h[v], u, 0, -w), h[v] = cnt++;
return;
}
void init(int _n) {
n = _n, cnt = 0, S = n + 1, T = n + 2;
memset(h, -1, sizeof h);
return;
}
int d[N];
bool inq[N], vis[N];
bool spfa() {
queue<int> q;
for (int i = 1; i <= n; ++i) d[i] = inf, inq[i] = 0;
d[S] = 0, inq[S] = inq[T] = 0, d[T] = inf;
q.push(S);
while (q.size()) {
int u = q.front();
q.pop(), inq[u] = 0;
for (int i = h[u]; ~i; i = e[i].nxt) {
int v = e[i].to, w = e[i].w;
if (e[i].fl >= e[i].r || d[v] <= d[u] + w) continue;
d[v] = d[u] + w;
if (!inq[v]) q.push(v), inq[v] = 1;
}
}
return (d[T] != inf);
}
int dfs(int u, int lim) {
if (u == T || lim == 0) return lim;
vis[u] = 1;
int ret = 0;
for (int i = nw[u]; ~i; i = nw[u]) {
int v = e[i].to, w = e[i].w, Limie;
if (d[v] != d[u] + w || vis[v]) {
nw[u] = e[i].nxt;
continue;
}
Limie = dfs(v, min(lim - ret, e[i].r - e[i].fl));
ret += Limie, e[i].fl += Limie, e[i ^ 1].fl -= Limie;
res += Limie * w;
if (ret == lim) break;
nw[u] = e[i].nxt;
}
return ret;
}
int dinic() {
for (int i = 0; i < cnt; ++i) e[i].fl = 0;
res = 0;
while (spfa()) {
for (int i = 1; i <= n + 2; ++i) nw[i] = h[i], vis[i] = 0;
nw[S] = h[S], nw[T] = h[T];
dfs(S, inf);
}
return res;
}
} zq;
signed main() {
return 0;
}

浙公网安备 33010602011771号