一 问题描述

在边权树中,路径 p 的 xor 长度定义为路径 p 上边权的 xor。

如果一个路径具有最大的 xor 长度,我们说该路径是 xor 最长的路径。给定具有 n 个节点的边权树,您能找到 xor 最长的路径吗?

二 输入和输出

1 输入

输入包含几个测试用例。每个测试用例的第一行包含一个整数 n (1<=n<=100000),以下 n-1 行每行包含三个整数 u  (0<= u < n)  , v ( 0  < = v<w) , w (0 <= w <2 ^31),这意味着在节点 u 和 v 之间的长度为 w。

2 输出

对于每个测试用例,输出 xor 最长的路径的 xor 长度。

三 输入和输出样例

1 输入样例

4

0 1 3

1 2 4

1 3 6

2 输出样例

7

四 分析和设计

定义 dx[i]:表示根节点到当前节点路径上所有边权的 xor 值。

通过一次 dfs 可以求出所有节点的 dx[i]。

树上任意两个节点 u、v 路径上边权的 xor 值等于 dx[u] xor dx[v],因为 x 和 x 异或等0,路径重复的部分会抵消掉。

问题转化为 dx[1]~dx[n] 中选出两个,求 xor 的最大值。

给定序列 a1、a2,…、an,任意两个数进行 xor(异或)运算,得到的最大值是多少?

可以通过 ai 和 a1,a2,…,ai-1 异或,得到一个最大值,穷举所有 i=2,…,n,取最大值即可。

首先将 a1,a2,…,ai-1 按位插入到字典树中,然后沿着与 ai 当前位相反的路径走,若与 ai 当前位相反的路径不存在,则走 ai 当前位。

五 代码

package com.platform.modules.alg.alglib.poj3764;public class Poj3764 {private int maxn = 100005;int n, mx; // n 个节点,最大值int trie[][]; //字典树存储的是01位int tot;int head[]; // 头结点int dx[] = new int[maxn]; // 从根到当前节点所有边权的 xor 值int cnt;Edge e[] = new Edge[maxn << 1];public String output = "";void add(int u, int v, int w) {e[++cnt].to = v;e[cnt].w = w;e[cnt].next = head[u];head[u] = cnt;}// 求 dx,从根到当前节点所有边权的 xor 值void dfs(int u, int f) {for (int i = head[u]; i > 0; i = e[i].next) {int v = e[i].to, w = e[i].w;if (v == f) // 父节点continue;dx[v] = dx[u] ^ w;dfs(v, u);}}void insert(int num) {int p = 1;for (int i = 30; i >= 0; i--) {int k = (num & (1 << i)) == 0 ? 0 : 1;if (trie[p][k] == 0)trie[p][k] = ++tot;p = trie[p][k];}}void init() {head = new int[maxn];trie = new int[maxn * 32][2];cnt = 0;tot = 1;mx = 0;for (int i = 0; i < e.length; i++) {e[i] = new Edge();}}int find(int num) {int p = 1, res = 0;for (int i = 30; i >= 0; i--) {int k = (num & (1 << i)) == 0 ? 0 : 1;if (trie[p][k ^ 1] != 0) { // 走相反路径res += 1 << i;p = trie[p][k ^ 1];} elsep = trie[p][k];}return res;}public String cal(String input) {int u, v, w;String[] line = input.split("\n");n = Integer.parseInt(line[0]);init();for (int i = 1; i < n; i++) { // n-1 条边String[] words = line[i].split(" ");u = Integer.parseInt(words[0]);v = Integer.parseInt(words[1]);w = Integer.parseInt(words[2]);add(u + 1, v + 1, w);add(v + 1, u + 1, w);}dx[1] = 0;dfs(1, 0);insert(dx[1]);for (int i = 2; i <= n; i++) {mx = Math.max(mx, find(dx[i]));insert(dx[i]);}output += mx + "\n";return output;}
}class Edge {int to, w, next;
}

六 测试

xor 最长路径问题相关推荐

  1. [POJ3249]Test for Job [拓扑排序+DAG上的最长路径]

    给定一张带点权的DAG 求一条入度为0节点到出度为0节点的最长路 把点权转化为边权(同时多源转化成单源):边u->v的权值为W[v],这样入度为0的节点权值会被遗漏,新开一个点0向入度为0的点u ...

  2. 算法提高课-动态规划-树形DP-AcWing 1072. 树的最长路径:dfs写法

    题目分析 来源:acwing 分析: 树的最长直径:距离最远的两个点之间的距离,这里是带边权的情况. 在没有边权(或者边权都是1)的时候,树的直径也是最远两个点的距离. 样例对应的树如下,树的直径= ...

  3. 201503-4 网络延时 (本质是求树的最长路径)

    树的最长路径 题目: 思路: 求解方法: 动态规划三部曲 1)状态定义 2)状态转移方程 (1)ACWing上的问题 (2) POJ上的问题 (3) CCF-CSP上的问题 参考博文: <1&g ...

  4. java图遍历求最长路径_如何在Java中使用递归实现矩阵中最长路径的返回

    我正试图用递归来解决这个问题. 问题是:对于二维正整数数组,我如何返回最长路径(步骤),以便最长路径的每个单元格中的值是从整数的降序序列开始的,并且每个单元格和单元格之间的差异是一个给定的数字(num ...

  5. 数据结构——二叉树的最长路径问题

    题目: 求任意二叉树中第一条最长的路径长度,并输出此路径上各结点的值. 描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写算法求出该二叉树中第一条最长的路径. 输入 一行数 ...

  6. Millenium Leapcow POJ - 2111 (千禧年跳牛)(贪心找最长路径,记忆化)

    题意: 给你一个矩阵,问你按照象棋马的走法,下一步比上一步的数大,问长度最长的序列是多长,然后输出序列.如果有多个最长序列输出字典序最小的那个.类似滑雪,找出最长路径,多个答案 输出字典序最小的. 思 ...

  7. Acwing 1072. 树的最长路径

    Acwing 1072. 树的最长路径 题意: 每个边有权值,求树的直径 题解: 两遍dfs可以求,这里用树形dp的方法,我们将1作为根节点来看这棵树 我们可以将点看作是钉子,边就是挂在钉子上的绳子, ...

  8. HDU3534 给你一个树让你找出其中最长路径以及个数数

    Description In the Datastructure class of HEU, the teacher asks one problem: How to find the longest ...

  9. 3006基于二叉链表的二叉树最长路径的求解(附思路)

    描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写算法求出该二叉树中第一条最长的路径. 输入 多组数据.每组数据一行,为二叉树的先序序列(序列中元素为'0'时,表示该结点为 ...

最新文章

  1. 在CentOS 6.3 64bit上为Apache Traffic Server 4.2.3挂载SSD并压测
  2. 数据结构源码笔记(C语言):链接栈
  3. struts2.1.8,hibernate3.3.2,spring2.5 整合需要哪些jar包
  4. 方向梯度直方图(Histogram Of Gradient)详解
  5. 注解_案例_简单的测试框架
  6. 不同串口通信速率超时时间_串口知识详解 串口功能及电路介绍
  7. P3377-[模板]左偏树(可并堆)
  8. wx-charts 微信小程序图表插件
  9. 草稿-git的使用-for windows -1006
  10. 【LeetCode】【HOT】114. 二叉树展开为链表(原地置换)
  11. java 获取工程编码格式_java 获取获取字符串编码格式
  12. js日期函数表达天,时,分,秒
  13. Gallery和BaseAdapter容器
  14. layui 工具条实现分页
  15. 【图像去噪】基于matlab高通+低通+带通+方向滤波器图像滤波【含Matlab源码 1209期】
  16. python2中打印中文
  17. Github网站中文汉化浏览器插件
  18. 单片机实验:外部中断系统实验 如何1357,2468灯交替亮
  19. IE的Kiosk模式
  20. 终端中显示git分支名称的方法

热门文章

  1. 英特尔hd630驱动_HD 630和驱动程序的兼容性问题
  2. Linux学习之网络相关命令
  3. 网站添加电视节目预告功能 php代码,电视节目预告API免费接口,电视节目预告API接口付费定制-进制数据...
  4. autojs免root脚本,QQ好友列表名片点赞源码
  5. 不要在浮躁的世界里迷失自己(长篇大论请慢慢读,或许正好说中了你的现状)
  6. 绥化学院2021聋人高考成绩查询,2020聋人高考形势分析
  7. android自动调用按钮事件,Android Button自动触发点击事件
  8. 【comsol学习2】-电化学模块学习与运行错误之循环伏安法
  9. 4G全流量竞争加剧 运营业模式变革提速
  10. Windows 10 修改桌面图标二(快捷方式图标)