P4551 最长异或路径

原题链接

题解

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

posted @   纯粹的  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示