P4551 最长异或路径
#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; }