社区讨论
萌新求教网络流
P3254圆桌问题参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @lvdv4skv
- 此快照首次捕获于
- 2024/04/24 21:40 2 年前
- 此快照最后确认于
- 2024/04/25 13:37 2 年前
-
Dinic板子P3376已过
-
只有答案为 0 的测试点是对的,交上去WA,本地VScode 用 cph 测卡死了
-
由于 Dinic 寄了,只写了判断方案是否存在的部分
-
问题似乎在 bfs和 dfs 中
-
求调,悬一关。谢谢!
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll maxn = 5e5 + 5;
const ll inf = 0x66ccff0712;
ll n, m, s, t;
ll r[maxn], c[maxn];
ll ans;
ll sum;
struct edge {
ll to;
ll next;
ll val;
};
vector<edge> e;
ll head[maxn], edgenum;
void add(ll u, ll v, ll w) {
e.push_back((edge){v, head[u], w});
head[u] = edgenum++;
}
ll now[maxn], dep[maxn];
ll bfs() {
for (ll i = 1; i <= n; i++) dep[i] = inf;
queue<ll> q;
q.push(s);
now[s] = head[s];
dep[s] = 0;
while (!q.empty()) {
ll x = q.front();
q.pop();
for (ll i = head[x]; i != -1; i = e[i].next) {
ll v = e[i].to;
if (e[i].val > 0 && dep[v] == inf) {
dep[v] = dep[x] + 1;
now[v] = head[v];
q.push(v);
if (v == t) return 1;
}
}
}
return 0;
}
ll dfs(ll x, ll sum) {
if (x == t) return sum;
ll k, res = 0;
for (ll i = now[x]; i != -1 && sum; i = e[i].next) {
now[x] = i;
ll v = e[i].to;
if (e[i].val > 0 && dep[v] == dep[x] + 1) {
ll k = dfs(v, min(sum, e[i].val));
if (!k) dep[v] = inf;
e[i].val -= k;
e[i ^ 1].val += k;
sum -= k;
res += k;
}
}
return res;
}
ll dinic() {
ll ans = 0;
while (bfs()) {
ans += dfs(s, inf);
}
// ans += dfs(s, inf);
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
memset(head, -1, sizeof(head));
memset(now, -1, sizeof(now));
cin >> n >> m;
s = 0, t = n + m + 1;
for (ll i = 1; i <= n; i++) {
cin >> r[i];
sum += r[i];
add(s, i, r[i]);
add(i, s, 0);
}
for (ll i = 1; i <= m; i++) {
cin >> c[i];
add(i + n, t, c[i]);
add(t, i + n, 0);
}
for (ll i = 1; i <= n; i++) {
for (ll j = 1; j <= m; j++) {
add(i, j + n, 1);
add(j + n, i, 0);
}
}
ans = dinic();
if (sum != ans) {
cout << 0 << "\n";
return 0;
}
cout << 1 << "\n";
cout << ans;
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...