B1954 The xor-longest Path

爆炸入口

给定一颗带权值的,节点数为n的树,求树上路径最大异或和。

solution: 先dfs将所有点到根的异或和算出来。然后放进tire树中贪心。

#include<cstdio>
#include<iostream>
using namespace std;
const int manx=100010;
int n;
struct node
{
    int point;
    int nxt;
    int val;
};
node line[manx<<1];
int head[manx],tail;
int dis[manx];
int t[manx<<5][2],end;
void add(int a,int b,int c)
{
    line[++tail].point=b;
    line[tail].val=c;
    line[tail].nxt=head[a];
    head[a]=tail;
}
void dfs(int now,int f,int sum)
{
    dis[now]=sum;
    for(int i=head[now];i;i=line[i].nxt)
        if(f!=line[i].point)
            dfs(line[i].point,now,sum^line[i].val);
    return ;
}
void ins(int val)
{
    int now=0;
    for(int i=(1<<30);i;i>>=1)
    {
        int nxt= (i&val) ? 1 : 0;
        if(!t[now][nxt])    t[now][nxt]=++end;
        now=t[now][nxt];
    }
    return ;
}
int find(int val)
{
    int res=0,now=0;
    for(int i=(1<<30);i;i>>=1)
    {
        int nxt=(i&val) ? 0 : 1;
        if(t[now][nxt]) now=t[now][nxt],res+=i;
        else            now=t[now][nxt^1];
    }
    return res;
}
int main()
{
    scanf("%d",&n);
    int a,b,c;
    for(int i=1;i<n;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c),add(b,a,c);
    }
    dfs(1,0,0);
    for(int i=1;i<=n;i++)
        ins(dis[i]);
    int ans=0;
    for(int i=1;i<=n;i++)
        ans=max(ans,find(dis[i]));
    printf("%d",ans);
}

猜你喜欢

转载自www.cnblogs.com/Lance1ot/p/9226232.html