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);
}
原文地址:https://www.cnblogs.com/Lance1ot/p/9226232.html