题解
1.任意两点间的异或和等于他们到根节点的异或和的异或,令每个点到根节点的异或值为 \(path[i]\)
2.建立01字典树,塞入所有 \(path[i]\) 然后遍历每个点,找出每个点异或最大对应的点
3.如何找?往当前 \(path[i]\) 的每一位相反的方向移动
code
#include<bits/stdc++.h>
using namespace std;
struct node
{
int to,val;
};
vector<node> G[100005];
int cnt=0;
int path[100005];
int tree[2000000][2]={0};
void dfs(int now,int fa)
{
for(auto next:G[now])
{
int to=next.to,val=next.val;
if(to==fa) continue;
path[to]=(path[now]^val);
dfs(to,now);
}
}
int main()
{
int n;
cin>>n;
for(int i=1;i<n;i++)
{
int x,y,v;
cin>>x>>y>>v;
G[x].push_back({y,v});
G[y].push_back({x,v});
}
dfs(1,0);
for(int i=1;i<=n;i++)
{
int now=0;
for(int k=30;k>=0;k--)
{
int next=((path[i]>>k)&1);
if(!tree[now][next]) tree[now][next]=++cnt;
now=tree[now][next];
}
}
int ans=0;
for(int i=1;i<=n;i++)
{
int now=0,sum=0;
for(int k=30;k>=0;k--)
{
int copys=((path[i]>>k)&1),next=(copys^1);
if(!tree[now][next]) next^=1;
now=tree[now][next];
sum|=((next^copys)<<k);
}
ans=max(ans,sum);
}
cout<<ans;
return 0;
}
标签:int,路径,tree,P4551,next,异或,path,now
From: https://www.cnblogs.com/pure4knowledge/p/18114237