牛客(多校5): Graph

在这里插入图片描述
示例;
输入

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);
}

猜你喜欢

转载自blog.csdn.net/qq_46144237/article/details/107583178