社区讨论

WA6pts求条

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mhjhriuc
此快照首次捕获于
2025/11/04 02:46
4 个月前
此快照最后确认于
2025/11/04 02:46
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 100010;
int n , m , fa[N][30] , dep[N] , f[N] , ans;
vector <int> v[N];
void build (int id , int f) {
    fa[id][0] = f; dep[id] = dep[f] + 1;
    for (int i = 0;i < v[id].size();i ++) {
        if (v[id][i] == f) continue;
        build (v[id][i] , id);
    }
    for (int i = 1;i <= 25;i ++) {
        fa[id][i] = fa[fa[id][i - 1]][i - 1];
    }
    return;
}
int LCA (int x , int y) {
    if (dep[x] < dep[y]) swap (x , y);
    int d = dep[x] - dep[y];
    for (int i = 25;i >= 0;i --) {
        if (d & (1 << i)) {
            x = fa[x][i];
        }
    }
    if (x == y) return x;
    for (int i = 25;i >= 0;i --) {
        if (fa[x][i] != fa[y][i]) {
            x = fa[x][i]; y = fa[y][i];
        }
    }
    return fa[x][0];
}
void dfs (int id) {
    for (int i = 0;i < v[id].size();i ++) {
        if (v[id][i] == fa[id][0]) continue;
        dfs (v[id][i]);
        f[id] += f[v[id][i]];
    }
    ans = max (ans , f[id]);
    return;
}
signed main () {
    cin >> n >> m;
    for (int i = 1;i < n;i ++) {
        int x , y;
        cin >> x >> y;
        v[x].push_back (y);
        v[y].push_back (x);
    }
    build (1 , 0); 
    while (m --) {
        int x , y;
        cin >> x >> y;
        int h = LCA (x , y);
        f[x] ++; f[y] ++; f[h] --;
        f[fa[h][0]] --;
    }
    dfs (1);
    // for (int i = 1;i <= n;i ++) {
    //     ans = max (ans , f[i]);
    //     //cout << f[i] << '\n';
    // }
    cout << ans;
    return 0;
}

回复

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

正在加载回复...