示例;
输入
6
0 1 1
1 2 4
1 3 3
0 4 5
0 5 2
输出
7
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100100;
int son[N*32][2],cnt=1;
int tot,h[N];
int n,x,y,z,c[N];
struct edge{
int y,next,z;
}g[N*2];
vector<int>a[N*32];
ll ans;
void adp(int x,int y,int z){
g[++tot].y=y;
g[tot].z=z;
g[tot].next=h[x];
h[x]=tot;
}
void dfs(int x,int f){
for (int i=h[x];i;i=g[i].next)
if (g[i].y!=f){
c[g[i].y]=c[x]^g[i].z;
dfs(g[i].y,x);
}
}
int query(int x,int d,int v){
if (d<0) return 0;
int w=(v>>d)&1;
if (son[x][w])
return query(son[x][w],d-1,v);
return query(son[x][w^1],d-1,v)+(1<<d);
}
void gao(int x,int d){
int ls=son[x][0],rs=son[x][1];
if (ls && rs){
int mn=1e9;
if (a[ls].size()>a[rs].size()) swap(ls,rs);
for (int i=0;i<a[ls].size();i++)
mn=min(mn,query(rs,d-1,a[ls][i]));
ans=ans+mn+(1<<d);
}
if (ls) gao(ls,d-1);
if (rs) gao(rs,d-1);
}
int main(){
scanf("%d",&n);
for (int i=1;i<n;i++){
scanf("%d%d%d",&x,&y,&z);
adp(x+1,y+1,z);
adp(y+1,x+1,z);
}
dfs(1,0);
for (int i=1;i<=n;i++){
int now=1;
for (int j=29;j>=0;j--){
int t=(c[i]>>j)&1;
if (!son[now][t])
son[now][t]=++cnt;
now=son[now][t];
a[now].push_back(c[i]);
}
}
gao(1,29);
printf("%lld\n",ans);
}