社区讨论

求助,全WA了

P4551最长异或路径参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@lo8jw1mv
此快照首次捕获于
2023/10/27 19:49
2 年前
此快照最后确认于
2023/10/27 19:49
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N = 2000001;
int n, u, v, w; 
int hd[N], cnt;
struct edge{
    int nt, to, w;
}e[N];
void add(int x, int y, int z){
    e[++cnt].nt = hd[x];
    hd[x] = cnt;
    e[cnt].to = y;
    e[cnt].w = z;
}
int dis[N];
void dfs(int u, int fa){
    for(int i = hd[u]; i; i = e[i].nt){
        v = e[i].to;
        w = e[i].w;
        if(fa != v){
            dis[v] = w ^ dis[u];
            dfs(v, u);
        }
    }
}
int sum[N][2];
void triepush(int s){
    int rt = 1;
    for(int i = 19; i; i --){
        int k = 0;
        if(s >= (1 << i)){
            s -= (1 << i);
            k = 1;
        }
        if(sum[rt][k] == 0){
            sum[rt][k] = ++cnt;
        }
        rt = sum[rt][k];
    }
}
int ans;
int query(int s){
    int as = 0;
    int rt = 1;
    for(int i = 19; i; i --){
        int k = 1;
        if(s >= (1 << i)){
            s -= (1 << i);
            k = 0;
        }
        if(sum[rt][k] != 0){
            as += (1 << i);
        }
        rt = sum[rt][!k];
    }
    return as;
}
int main(){
    scanf("%d", &n);
    for(int i = 1; i < n; i ++){
        scanf("%d%d%d", &u, &v, &w);
        add(u, v, w);
        add(v, u, w);
    }
    dfs(1, 0);
    cnt = 1;
    for(int i = 1; i <= n; i ++){
        triepush(dis[i]);
    }
    for(int i = 1; i <= n; i ++){
        ans = max(ans, query(dis[i]));
    }
    printf("%d\n", ans);
    return 0;
}

回复

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

正在加载回复...