求助
  • 板块灌水区
  • 楼主封禁用户
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/11/7 19:05
  • 上次更新2024/11/7 21:21:12
查看原帖
求助
608410
封禁用户楼主2024/11/7 19:05

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;
}
2024/11/7 19:05
加载中...