社区讨论
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 条回复,欢迎继续交流。
正在加载回复...