poj 3764 最长异或路径(二进制trie树)

该博客介绍了一种利用二进制Trie树解决POJ 3764问题的方法。问题是在一棵树中寻找具有最大异或和的路径。通过DFS生成从根节点到每个节点的异或路径,并使用Trie树进行贪心查找,以O(n*log2n)的时间复杂度找到最长路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【问题描述】

  给你一棵树,n个节点,n-1条边每条边i都有一个权值wi。定义任意两点间的权值为:这两点间的路径上的所有边的值的异或。比如a点和b点间有i,j,k三条边,那么ab两点间的权值为:wi^wj^wk。求这个最大的权值(最长异或路径)。

【输入格式】

  第一行为n表示节点数目(节点编号为1..n)。
  接下来的n-1行,每行三个整数:u v w,表示一条树边(x,y)的权值为w(0<=w<2^31)。

【输出格式】

  输出最长异或路径长度。

【输入样例】

4
1 2 3
2 3 4
2 4 6

【输出样例】

【样例解释】

The xor-longest path is 0->1->2, which has length 7 (=3 ⊕ 4)

【数据范围】

n<=250000

【来源】

poj 3764

这道题都能想到用dfs来生成根到每一个点的异或路径,但生成之后的操作就是重点了。
首先我们可以很容易的想到任意2个点直接的异或路径就是他们到跟的异或路径的异或值,证明如下:
设2点为x,y,公共祖先是z。z到根的异或路径是c,x到z的异或路径是a,y到z的异或路径是b。可得a^b=a^c^b^c。
不用二进制trie树的话很容易想到一个n^2时间复杂的算法,就是每2个数进行异或。但如果有了二进制trie树就可以先生成树,在再树上贪心的进行查找,很容易就可以得到最大值了,时间复杂度(n*log2n)。

#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<iostream>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值