加载中…
个人资料
JosiahChiu
JosiahChiu
  • 博客等级:
  • 博客积分:0
  • 博客访问:7,207
  • 关注人气:87
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

POJ 3764 字典树应用 异或运算

(2011-05-04 22:38:57)
标签:

poj

3764

字典树应用

异或运算

it

分类: 图论

题目描述:

给你一棵树,n个节点(n = 100000),n-1条边每条边i都有一个权值wi

定义任意两点间的权值为:

这两点间的路径上的所有边的值的异或。

比如a点和b点间有ijk三条边,那么ab两点间的权值为:wi^wj^wk

求这个最大的权值。

解题报告:

转自:http://blog.csdn.net/zhaofukai/archive/2011/03/12/6242612.aspx

这道题要求最长的异或路径:就是在树中找两个节点,两个节点间有唯一路径(因为是树),把路径不断做异或,异或完后求最大的。数据是10万,On2)算法超时。我们知道异或有这样的性质:a^b = (a^c)^(b^c),这样就可以考虑找出ab公共的c,实际上就是求出从根节点到每个节点的异或值,这样任意两个点做异或,即是他们之间的异或路径(相同部分异或抵消了)。可以dfs遍历一遍,我在这里就花了很多时间,用邻接表表示树用的很少,很不熟练。然后可以用字典树来储存每个节点的值,问题又转化成求这n个数中,任意两个数做异或,求最大值,用字典树的复杂度为On*31),前面dfs复杂度为O(n),所以效率还是比较好的。程序中注意优化,否则TLE,例如:uv节点,u可能比v大,我们就交换它们来建邻接点,而不必建两次。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有