社区讨论

萌新求教网络流

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 中
  • 求调,悬一关。谢谢!
CPP
#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 条回复,欢迎继续交流。

正在加载回复...