爱仕达所多撒多撒大所

 
#include<bits/stdc++.h>
#define il inline
using namespace std;
const int N=100010;
il int read(){
    int f=1,w=0;char c=0;
    while(!isdigit(c))
    {
        if(c=='-') f=-1;
        c=getchar();
    }
    while(isdigit(c)) w=w*10+(c^48),c=getchar();
    return f*w;
}
int n,dis[N],ch[10*N][2],tot,ans,cnt;
int head[N],ver[2*N],edge[2*N],nex[2*N];
void add(int x,int y,int z){
    ver[++tot]=y,edge[tot]=z,nex[tot]=head[x],head[x]=tot;
}
void dfs(int p,int f){
    for(int i=head[p];i;i=nex[i])
    {
        int y=ver[i],z=edge[i];
        if(y==f) continue;
        dis[y]=(dis[p]^z);
        dfs(y,p);
    }
}
void build(int v){
    int x=0;
    for(int i=31;i>=0;i--)
    {
        int a=(v&(1<<i))>>i;
        if(!ch[x][a]) ch[x][a]=++cnt;
        x=ch[x][a];
    }
}
int query(int v){
    int x=0,res=0;
    for(int i=31;i>=0;i--)
    {
        int a=(v&(1<<i))>>i;
        if(ch[x][!a]) res+=(1<<i),x=ch[x][!a];
        else x=ch[x][a];
    }
    return res;
}
int main(){
    n=read();
    for(int i=1;i<n;i++)
    {
        int x=read(),y=read(),z=read();
        add(x,y,z);add(y,x,z);
    }
    dfs(1,0);
    for(int i=1;i<=n;i++) build(dis[i]);
    for(int i=1;i<=n;i++) ans=max(ans,query(dis[i]));
    cout<<ans<<endl;
    return 0;
}
 

 

猜你喜欢

转载自www.cnblogs.com/ajy-shi-cj-zui-cai/p/10359995.html