社区讨论

SPFA+EK WA8~11求助

P3381【模板】最小费用最大流参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mi615w9y
此快照首次捕获于
2025/11/19 21:20
4 个月前
此快照最后确认于
2025/11/21 00:00
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pii = pair<ll, ll>;
const int Mod = 1e9 + 7, mod = 998244353, N = 5e3 + 10, M = 1e5 + 10;
const ll inf = 0x3f3f3f3f3f3f3f3f;
int n, m, s, t, head[N], now[N], cnt = 1, vis[N], pre[N];
ll flow, cost, dis[N];
struct no{int v, nxt; ll w, c;} g[M];
void add(int u, int v, ll w, ll c) {g[++cnt] = {v, head[u], w, c}, head[u] = cnt;}

bool spfa() {
	memset(dis, 0x3f, sizeof(ll) * (n + 5));
	memset(vis, 0, sizeof vis);
	queue<int> q;
	q.push(s), dis[s] = 0, vis[s] = 1;
	while(q.size()) {
		int u = q.front(); q.pop();
		for (int i = head[u]; ~i; i = g[i].nxt) {
			int v = g[i].v;
			if (dis[v] > dis[u] + g[i].w && g[i].c) {
				dis[v] = dis[u] + g[i].w, pre[v] = i;
				if (!vis[v]) vis[v] = 1, q.push(v);
			}
		}
	}
	return dis[t] != inf;
}


int main() {
	cin.tie(0) -> ios::sync_with_stdio(false);
	memset(head, -1, sizeof head);
	cin >> n >> m >> s >> t;
	for (int i = 1; i <= m; i++) {
		int u, v, w, c;
		cin >> u >> v >> c >> w;
		add(u, v, w, c), add(v, u, -w, 0);
	}
	while(spfa()) {
		ll minn = inf;
		int v = t;
		while(v ^ s) minn = min(minn, g[pre[v]].c), v = g[pre[v] ^ 1].v;
		v = t, flow += minn, cost += dis[t] * minn;
		while(v ^ s) g[pre[v]].c -= minn, g[pre[v] ^ 1].c += minn, v = g[pre[v] ^ 1].v;
	}
	cout << flow << " " << cost << endl;
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...