社区讨论

悬关求调

P3128[USACO15DEC] Max Flow P参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@lz6kx8to
此快照首次捕获于
2024/07/29 13:59
2 年前
此快照最后确认于
2024/07/29 15:08
2 年前
查看原帖
rt
CPP
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;

typedef long long l;
l n, k, x, y, d[50005], p[50005][20], diff[50005], a[50005];
vector<l> v[50005];

void dfs(l x, l dad) {
    d[x] = d[dad] + 1;
    p[x][0] = dad;
    for (l i(1); (1 << (i - 1)) <= d[x]; ++i) {
        p[x][i] = p[p[x][i - 1]][i - 1];
    }
    for (l y : v[x]) {
        if (y != dad) {
            dfs(y, x);
        }
    }
}

l lca(l x, l y) {
    if (d[x] < d[y]) swap(x, y);
    for (l i(16); i >= 0; --i) {
        if (d[p[x][i]] >= d[y]) {
            x = p[x][i];
        }
    }
    if (x == y) return x;
    for (l i(16); i >= 0; --i) {
        if (p[x][i] != p[y][i]) {
            x = p[x][i];
            y = p[y][i];
        }
    }
    return p[x][0];
}

void dfs2(l x, l dad) {
    for (l y : v[x]) {
        if (y == dad) continue;
        dfs2(y, x);
        a[x] += a[y];
    }
    a[x] += diff[x];
}

int main() {
    scanf("%lld%lld", &n, &k);
    for (l i(1); i <= n; ++i) {
        scanf("%lld%lld", &x, &y);
        v[x].push_back(y);
        v[y].push_back(x);
    }
    dfs(1, 0);
    while (--k > -1) {
        scanf("%lld%lld", &x, &y);
        l z(lca(x, y));
        diff[x]++;
        diff[p[z][0]]--;
        diff[y]++;
        diff[z]--;
    }
    dfs2(1, 0);
    l ans(0);
    for (l i(1); i <= n; ++i) {
        ans = max(ans, a[i]);
    }
    printf("%lld", ans);
    return 0;
}

回复

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

正在加载回复...