社区讨论
求助,全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 条回复,欢迎继续交流。
正在加载回复...