博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【bzoj1954】Pku3764 The xor-longest Path Trie树
阅读量:5337 次
发布时间:2019-06-15

本文共 1619 字,大约阅读时间需要 5 分钟。

题目描述

 给定一棵n个点的带权树,求树上最长的异或和路径

输入

The input contains several test cases. The first line of each test case contains an integer n(1<=n<=100000), The following n-1 lines each contains three integers u(0 <= u < n),v(0 <= v < n),w(0 <= w < 2^31), which means there is an edge between node u and v of length w.

输出

For each test case output the xor-length of the xor-longest path.

样例输入

4

1 2 3
2 3 4
2 4 6

样例输出

7


题解

Trie树

由于x^x=0,所以树上x和y之间路径的异或和 = x到根路径的异或和 xor y到根路径的异或和。

所以我们先对整棵树进行dfs,求出每个节点到根的路径异或和dis,并加入到Trie树。

然后枚举树上的节点,在Trie树中贪心查询与它异或和最大的数,并加到答案中即可。

#include 
#include
#define N 100010using namespace std;int head[N] , to[N << 1] , len[N << 1] , next[N << 1] , cnt , v[N] , c[N * 30][2] , tot;void add(int x , int y , int z){ to[++cnt] = y , len[cnt] = z , next[cnt] = head[x] , head[x] = cnt;}void dfs(int x , int fa){ int i; for(i = head[x] ; i ; i = next[i]) if(to[i] != fa) v[to[i]] = v[x] ^ len[i] , dfs(to[i] , x);}void insert(int x){ int i , p = 0; bool t; for(i = 1 << 30 ; i ; i >>= 1) { t = x & i; if(!c[p][t]) c[p][t] = ++tot; p = c[p][t]; }}int query(int x){ int i , p = 0 , ans = 0; bool t; for(i = 1 << 30 ; i ; i >>= 1) { t = x & i; if(c[p][t ^ 1]) ans += i , p = c[p][t ^ 1]; else p = c[p][t]; } return ans;}int main(){ int n , i , x , y , z , ans = 0; scanf("%d" , &n); for(i = 1 ; i < n ; i ++ ) scanf("%d%d%d" , &x , &y , &z) , add(x , y , z) , add(y , x , z); dfs(1 , 0); for(i = 1 ; i <= n ; i ++ ) insert(v[i]); for(i = 1 ; i <= n ; i ++ ) ans = max(ans , query(v[i])); printf("%d\n" , ans); return 0;}

 

 

转载于:https://www.cnblogs.com/GXZlegend/p/7072616.html

你可能感兴趣的文章
忘记root密码,怎么办
查看>>
linux设备驱动归纳总结(三):1.字符型设备之设备申请【转】
查看>>
《黑客与画家》 读书笔记
查看>>
bzoj4407: 于神之怒加强版
查看>>
mysql统计一张表中条目个数的方法
查看>>
ArcGIS多面体(multipatch)解析——引
查看>>
css3渐变画斜线 demo
查看>>
JS性能DOM优化
查看>>
设计模式 单例模式 使用模板及智能指针
查看>>
c#的const可以用于引用类型吗
查看>>
手动实现二值化
查看>>
What Linux bind mounts are really doing
查看>>
linux top命令详解
查看>>
博弈论小结
查看>>
模拟Post登陆带验证码的网站
查看>>
NYOJ458 - 小光棍数
查看>>
java中常用方法
查看>>
【Programming Clip】06、07年清华计算机考研上机试题解答(个别测试用例无法通过)...
查看>>
canvas动画
查看>>
4,7周围玩家
查看>>