板子集合

图论

网络流

网络流模板:

最大流:

#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;
}
posted @ 2024-10-14 16:04  yaoyanfeng  阅读(4)  评论(0)    收藏  举报