The xor-longest Path

题目描述

给定一棵\(n≤100 000\)个点的带权树,求树上最长的异或和路径。

输入

多组数据。每组数据第一行一个整数n(\(1≤n≤100 00\),接下去n-1行每行三个整数\(u(0≤u<n) ,v(0≤v<n) ,w(0≤w<2^{31})\),表示u和v之间的长度为w的边。

输出

对于每组数据输出结果。

样例输入

4

1 2 3

2 3 4

2 4 6

样例输出

7

题解

其实也是很简单的一道题,因为题目输入是一棵树,有边权,要我们求树上的最长异或和路径,可以想到这样一个性质,一遍深搜处理出每个点到根节点的异或值d[x],那么树上任意两个点的异或和其实就是d[x]^d[y],如果实在不懂可以自己动手画一棵树感受一下,那么问题就转化成了在d[1]~d[n]中任选两个点,求异或值最大,也就是这道题The Xor Largest Pair,剩下的也不用讲了,trie树裸题

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. #define Min(a,b) (a)<(b)?(a):(b)
  7. #define Max(a,b) (a)>(b)?(a):(b)
  8. #define in(i) (i=read())
  9. using namespace std;
  10. int read() {
  11. int ans=0,f=1; char i=getchar();
  12. while(i<'0' || i>'9') {if(i=='-') f=-1; i=getchar();}
  13. while(i>='0' && i<='9') {ans=(ans<<1)+(ans<<3)+i-'0'; i=getchar();}
  14. return ans*f;
  15. }
  16. int tot,n,cnt,ans;
  17. struct edge {
  18. int to,next,v;
  19. }e[200010];
  20. int head[100010];
  21. int trie[4000010][2],d[100010];
  22. void add(int a,int b,int c) {
  23. e[++cnt].to=b;
  24. e[cnt].v=c;
  25. e[cnt].next=head[a];
  26. head[a]=cnt;
  27. }
  28. void dfs(int u,int fa) {
  29. for(int i=head[u];i;i=e[i].next) {
  30. int to=e[i].to;
  31. if(to!=fa) {
  32. d[to]=(d[u]^e[i].v);
  33. dfs(to,u);
  34. }
  35. }
  36. }
  37. void insert(int x) {
  38. int p=0;
  39. for(int i=31;i>=0;--i) {
  40. int c=(x>>i&1);
  41. if(!trie[p][c]) trie[p][c]=++tot;
  42. p=trie[p][c];
  43. }
  44. }
  45. int find(int x) {
  46. int sum=0,p=0;
  47. for(int i=31;i>=0;--i) {
  48. int c=(x>>i&1),o=(c^1);
  49. if(trie[p][o]) p=trie[p][o],sum=(sum<<1|1);
  50. else p=trie[p][c],sum<<=1;
  51. }
  52. return sum;
  53. }
  54. int main()
  55. {
  56. while(scanf("%d",&n)!=EOF) {
  57. ans=tot=cnt=0;
  58. memset(d,0,sizeof(d));
  59. memset(e,0,sizeof(e));
  60. memset(head,0,sizeof(head));
  61. for(int i=1;i<n;++i) {
  62. int u,v,c;
  63. in(u); in(v); in(c);
  64. add(u,v,c); add(v,u,c);
  65. } dfs(1,0);
  66. for(int i=1;i<=n;++i) {
  67. ans=Max(ans,find(d[i]));
  68. insert(d[i]);
  69. }
  70. printf("%d\n",ans);
  71. }
  72. return 0;
  73. }

博主蒟蒻,随意转载.但必须附上原文链接

http://www.cnblogs.com/real-l/

The xor-longest Path [Trie]的更多相关文章

  1. poj3764 The XOR Longest Path【dfs】【Trie树】

    The xor-longest Path Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10038   Accepted:  ...

  2. 题解 bzoj1954【Pku3764 The xor – longest Path】

    做该题之前,至少要先会做这道题. 记 \(d[u]\) 表示 \(1\) 到 \(u\) 简单路径的异或和,该数组可以通过一次遍历求得. \(~\) 考虑 \(u\) 到 \(v\) 简单路径的异或和 ...

  3. Solve Longest Path Problem in linear time

    We know that the longest path problem for general case belongs to the NP-hard category, so there is ...

  4. Why longest path problem doesn't have optimal substructure?

    We all know that the shortest path problem has optimal substructure. The reasoning is like below: Su ...

  5. Poj 3764 The xor-longest Path(Trie树+xor+贪心)

    The xor-longest Path Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6455 Accepted: 1392 ...

  6. 【bzoj1954】Pku3764 The xor-longest Path Trie树

    题目描述  给定一棵n个点的带权树,求树上最长的异或和路径 输入 The input contains several test cases. The first line of each test ...

  7. [USACO]6.1.3 cow xor(二进制+Trie)

    题意:给你一个序列(n<=100000),求出一个连续的子序列[i,j]使得ai xor ai+1 xor…… xor aj最大,求出这个最大值(其中每个数<=2^21) 分析:题目和求一 ...

  8. POJ3764 The xor-longest path Trie树

    代码写了不到30分钟,改它用了几个小时.先说题意,给你一颗树,边上有权,两点间的路径上的路径的边权抑或起来就是路径的xor值,要求的是最大的这样的路径是多少.讲到树上的两点的xor,一个常用的手段就是 ...

  9. 【xsy1147】 异或(xor) 可持久化trie

    我的脑回路可能比较奇怪. 我们对这些询问离线,将所得序列${a}$的后缀和建$n$棵可持久化$trie$. 对于一组询问$(l,r,x)$,我们在主席树上询问第$l$棵树$-$第r$+1$棵树中与$s ...

随机推荐

  1. python学习——基本数据类型

    一.运算符 1.算术运算: 2.比较运算 3.赋值运算 4.逻辑运算 5.成员运算 二.基本数据类型 1.数字 1.1 整形数字和长整形数字:在32位机器上,整数的位数为32位,取值范围为-2**31 ...

  2. python三大神器之迭代器

    可迭代协议: 内部含有__iter__方法的值/变量都是可迭代的.可迭代类型和python语言之间的协议. 可迭代对象: iterable,内部包含__iter__()函数. 迭代器: iterato ...

  3. 【7-10 PAT】树的遍历

    给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数.第二行给出其后序遍历序列.第三 ...

  4. react ant-design自定义图标

    ant-design给我们提供的图标不够怎么办呢?答案是我们可以自定义图标. 自定义图标也挺简单的,现在图标推荐用svg格式,那么我们就需要制作svg图片. 下面让我们看看如果制作svg图片吧. 1. ...

  5. Tomcat配置SSL连接

    1.服务器端单项认证 在Tomcat的server.xml文件中,已经提供了现成的配置SSL连接器的代码,只要把<Connector>元素的注释去掉即可: <!—  Define a ...

  6. 编译net core时nuget里全部报错,\obj\project.assets.json找不到

    除了Nuget管理设置允许下载缺少的程序包 如果你自己设置的程序包源里有一个源访问不到,则可能出现下面错误,导致所有nuget无法还原. 而且在VS2017里不会出现这个 SDK,特别是你网上下载的其 ...

  7. Ubantu修改主机名详细步骤

    使用vmWare创建的Ubantu虚拟主机,默认的主机名均为Ubantu,通过修改主机名的使得分布式集群操作变得方便.具体步骤如下: 1.查看虚拟机的主机名:打开终端,使用 hostname 命令,回 ...

  8. javascript对象转为字符串

    function getStringTime(time){ //年 year = time.getFullYear(); //月 month = time.getMonth() if(String(m ...

  9. centos redis 安装 php-redis扩展安装 及使用

    前提:centos7.php7 安装redis-server 1:yum install redis 编译安装php-redis 扩展 1:下载编译安装 wget https://codeload.g ...

  10. ubuntu 把软件源修改为国内源

    国内有很多Ubuntu的镜像源,比如:阿里源.网易源等,还有很多教育网的源,比如:清华源.中科大源等. 这里以清华源为例讲解如何修改Ubuntu 18.04里面默认的源. 修改步骤 第一步:备份原始源 ...