码迷,mamicode.com
首页 > 其他好文 > 详细

P4551 最长异或路径

时间:2019-11-14 09:16:38      阅读:56      评论:0      收藏:0      [点我收藏+]

标签:str   mes   i++   turn   com   clu   code   lse   路径   

技术图片

 

 


#include<bits/stdc++.h>
using namespace std;
int n,m,a,b,c,ne,tot,head[100008*30],ch[100008*30][3];long long val[100008*30],ans=-1;
struct node{int nxt,v;long long d;}eg[100008*30];
void adde(int a,int b,int c)
{eg[++ne].v=b;eg[ne].d=c;eg[ne].nxt=head[a];head[a]=ne;}
void dfs(int u,int fa)
{
    for(int i=head[u];i;i=eg[i].nxt)
    if(eg[i].v!=fa){val[eg[i].v]=(val[u]^eg[i].d);dfs(eg[i].v,u);}
}
void pre(long long num)
{
    int pos=0;
    for(int b=30;b>=0;b--)
    {
        int t=(num&(1<<b))>>b;
        if(!ch[pos][t])ch[pos][t]=++tot;
        pos=ch[pos][t];
    }
}
long long qy(long long num)
{
    long long ans=0;int pos=0;
    for(int i=30;i>=0;i--)
    {
        int t=(num&(1<<i))>>i;
        if(ch[pos][t^1]){ans+=(1<<i);pos=ch[pos][t^1];}
        else pos=ch[pos][t];
    }
    return ans;
}
int main()
{
    cin>>n;
    for(int i=1;i<n;i++){cin>>a>>b>>c;adde(a,b,c);adde(b,a,c);}
    dfs(1,0);
    for(int i=1;i<=n;i++)pre(val[i]);
    for(int i=1;i<=n;i++)ans=max(ans,qy(val[i]));
    cout<<ans;
}

 

P4551 最长异或路径

标签:str   mes   i++   turn   com   clu   code   lse   路径   

原文地址:https://www.cnblogs.com/SFWR-YOU/p/11854579.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!