代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
int cnt,tot,t,ans,num;
int sum[MAXN];
struct EDGE{
int from,to,w,pre;
}edge[MAXN<<1];
int head[MAXN];
void add(int from,int to,int w)
{
edge[++cnt].from=from;
edge[cnt].to=to;
edge[cnt].w=w;
edge[cnt].pre=head[from];
head[from]=cnt;
return;
}
int n,u,v,w;
struct TRIE{
int ch[2];
}trie[MAXN<<5];
void dfs(int son,int fa)
{
for(int i=head[son];i;i=edge[i].pre)
{
if(edge[i].to==fa) continue;
sum[edge[i].to]=sum[son]^edge[i].w;
dfs(edge[i].to,son);
}
return;
}
void build_trie(int w,int now)
{
for(int i=(1<<25);i;i=i>>1)
{
t=w&i;
if(trie[now].ch[t]==0)
trie[now].ch[t]=++tot;
now=trie[now].ch[t];
}
return;
}
int find(int w,int now)
{
num=0;
for(int i=(1<<25);i;i=i>>1)
{
t=w&i;
if(trie[now].ch[!t])
{
num+=i;
now=trie[now].ch[!t];
}
else now=trie[now].ch[t];
}
return num;
}
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,1);
for(int i=1;i<=n;i++) build_trie(sum[i],0);
for(int i=1;i<=n;i++) ans=max(ans,find(sum[i],0));
printf("%d\n",ans);
return 0;
}
提交记录