poj 3764 The xor-longest Path
2014-05-17 20:56
309 查看
题目
在一棵树上求出一条路径,使路径上的权值异或结果最大。
和求树上的两点的距离类似,先求出每个点到根节点的异或值,那么Xor[i][j]=dis[i]^dis[j],但要注意,i,j好像不能是根节点,不过i点到根节点的异或值在dfs时就知道了。
怎么求Xor[i][j]呢,用二进制字典树,再插入一个数dis[i]的同时,你可以得到他与以前插入的dis[j]异或的最大值。
在一棵树上求出一条路径,使路径上的权值异或结果最大。
和求树上的两点的距离类似,先求出每个点到根节点的异或值,那么Xor[i][j]=dis[i]^dis[j],但要注意,i,j好像不能是根节点,不过i点到根节点的异或值在dfs时就知道了。
怎么求Xor[i][j]呢,用二进制字典树,再插入一个数dis[i]的同时,你可以得到他与以前插入的dis[j]异或的最大值。
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int N=100005; int n; int a,b,c,ans; int dis ; struct Edge{ int v,next,w; }edge[N*2]; int head ,e; struct node{ int next[2]; void init(){ memset(next,-1,sizeof(next)); } }root[N*32]; int up; inline void add(int u,int v,int w){ edge[e].v=v; edge[e].w=w; edge[e].next=head[u]; head[u]=e++; } inline void In(){ memset(head,-1,sizeof(head));e=0; for(int i=1;i<n;i++){ scanf("%d%d%d",&a,&b,&c); add(a,b,c); add(b,a,c); } } inline void dfs(int now,int pre,int w){ dis[now]=w; ans=max(ans,dis[now]); for(int i=head[now];i!=-1;i=edge[i].next){ Edge j=edge[i]; int v=j.v,val=j.w; if(v!=pre){ dfs(v,now,w^val); } } } inline int insert(int a){ int p=0,q=0,tmp=0,tag=0; for(int i=30;i>=0;i--){ int id=0; if(a&(1<<i)) id=1; if(!tag){ if(root[q].next[id^1]!=-1){ tmp |= (1<<i); q=root[q].next[id^1]; } else{ if(root[q].next[id]==-1){ tag=1; } q=root[q].next[id]; } } if(root[p].next[id]==-1){ root[p].next[id]=up; root[up++].init(); } p=root[p].next[id]; } //printf("%d\n",tmp); return tag?0:tmp; } inline void Work(){ ans=0; dfs(0,-1,0); up=0;root[up++].init(); for(int i=1;i<n;i++){ ans=max(ans,insert(dis[i])); } printf("%d\n",ans); } int main(){ while(~scanf("%d",&n)){ In(); Work(); } return 0; }
相关文章推荐
- poj 3764 The xor-longest Path 找异或值最大的两个数
- POJ 3764 The xor-longest Path
- POJ 3764 The xor-longest Path
- POJ 3764 The xor-longest Path
- POJ 3764 The xor-longest Path
- [POJ 3764] The xor-longest Path
- POJ 3764 The xor-longest Path
- POJ 3764 The xor-longest Path
- POJ 3764 The xor-longest Path
- trie--- POJ 3764 The xor-longest Path
- POJ 3764 The xor-longest Path 字典树 异或性质
- poj 3764 The xor-longest Path Trie
- Poj 3764 The xor-longest Path(Trie树+xor+贪心)
- 【POJ 3764】The xor-longest Path 中文题意&题解&代码(C++)
- poj 3764 The xor-longest Path(字典树)
- [POJ 3764] The xor-longest Path (Tire树 + 贪心)
- POJ 3764 The xor-longest Path ( 字典树应用—— 求连续段相异或最大最小的线性算法)(好题)
- POJ 3764 The xor-longest Path(字典树 + 贪心)
- BZOJ1954: Pku3764 The xor-longest Path
- BZOJ1954 Pku3764 The xor-longest Path