最长异或路径
题目链接:最长异或路径
题目描述

解题思路
我们可以预处理出从根节点到每一个节点路径上所有边权的异或值。
然后就和前缀统计一样了。
code
#include<iostream>
#include<cstdio>
using namespace std;
int n,ans;
int a[1000010];
int v[1000010];
int hd[1000010],tot;
int trie[1000010][2];
struct abc{
int to,next,w;
}b[1000010];
void add(int x,int y,int w)
{
b[++tot]=(abc){y,hd[x],w};
hd[x]=tot;
}
void dfs(int x,int s)
{
v[x]=1;
a[x]=s;
for(int i=hd[x];i;i=b[i].next)
if(!v[b[i].to])
dfs(b[i].to,s^b[i].w);
}
void in(int t)
{
int now=1;
for(int i=31;i>=0;i--)
{
int c=(t>>i)&1;
if(!trie[now][c])
trie[now][c]=++tot;
now=trie[now][c];
}
}
void fd(int t)
{
int now=1,s=0;
for(int i=31;i>=0;i--)
{
int c=!((t>>i)&1);
if(trie[now][c])
s+=(1<<i);
else
c=!c;
now=trie[now][c];
}
ans=max(ans,s);
}
int main()
{
cin>>n;
for(int i=1;i<n;i++)
{
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
add(x,y,w);
add(y,x,w);
}
dfs(1,0);
for(int i=1;i<=n;i++)
{
fd(a[i]);
in(a[i]);
}
cout<<ans<<endl;
}

该博客探讨了如何解决最长异或路径问题。通过预处理从根节点到每个节点的路径上边权的异或值,可以采用类似于前缀统计的方法来求解。详细解题思路和代码实现也在文中进行了解析。
210

被折叠的 条评论
为什么被折叠?



