题意 :  一颗树,每个边有个值,在树上找一条简单路径,使得这条路径上的边权异或值最大
先找到所有节点到一点的距离 , 显然dis( x , y ) = dis( z , x )^dis( z , y )
那么把所有的距离都以二进制由高到低存到trie中 , 扫一遍每个点 , 在trie树上由高到低找某位与该点某位相反的数 , 找不到则妥协找下一位 , 如此贪心即可 
写的时候超空间一次re两次,trie树的大小设置为30*n刚好,不要想太多设置太大或者因为走极端设置得过小...就按数据量设置就可以...
代码
 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const int maxn=;
const double eps=1e-;
const long long modn=;
int n;
int ans=;
struct nod{
int y;
int next;
int v;
}e[maxn*];
int head[maxn]={},tot=;
int dis[maxn]={};
struct tri{
bool exist;
int v;
int next[];
}a[maxn*];
int tot1=;
void init(int x,int y,int z){
e[++tot].y=y;
e[tot].v=z;
e[tot].next=head[x];
head[x]=tot;
}
void doit(int x,int v,int k){
if(k<){
a[x].exist=;
a[x].v=v;
return;
}int z;
if(v&(<<k)){
z=;
}else{
z=;
}
if(!a[x].next[z]){
a[x].next[z]=++tot1;
}doit(a[x].next[z],v,k-);
}
void getit(int x,int v,int k){
if(k<){
int z=v^a[x].v;
ans=max(ans,z);
return;
}int z;
if(v&(<<k)){
z=;
}else{
z=;
}
if(!a[x].next[z]){
z=^z;
}getit(a[x].next[z],v,k-);
}
void dfs(int x,int fa,int val){
int y,v,z;
for(int i=head[x];i;i=e[i].next){
y=e[i].y;
v=e[i].v;
if(y!=fa){
z=val^v;
dis[y]=z;
dfs(y,x,z);
}
}
}
void yu(){
memset(a,,sizeof(a));
memset(e,,sizeof(e));
memset(head,,sizeof(head));
tot1=tot=;
memset(dis,,sizeof(dis));
ans=;
}
int main(){
while(~scanf("%d",&n)){
yu();
int x,y,z;
for(int i=;i<n;i++){
scanf("%d%d%d",&x,&y,&z);
init(x+,y+,z);
init(y+,x+,z);
}
dfs(,,);
for(int i=;i<=n;i++){
getit(,dis[i],);
doit(,dis[i],);
}
printf("%d\n",ans);
}
return ;
}

POJ 3764 The xor-longest Path trie树解决位运算贪心的更多相关文章

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

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

  2. 【POJ 3764】 The xor-longest path

    [题目链接] http://poj.org/problem?id=3764 [算法] 首先,我们用Si表示从节点i到根的路径边权异或和 那么,根据异或的性质,我们知道节点u和节点v路径上的边权异或和就 ...

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

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

  4. POJ3764 The xor-longest path Trie树

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

  5. HDU 4825 Xor Sum (trie树处理异或)

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)Total S ...

  6. HDU4825 Xor Sum(字典树解决最大异或问题)

    Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeus 发起M次询问,每次询问中包含一个正整 ...

  7. POJ-2777-CountColor(线段树,位运算)

    链接:https://vjudge.net/problem/POJ-2777#author=0 题意: Chosen Problem Solving and Program design as an ...

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

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

  9. 【POJ 3764】The Xor-longest Path

    题目 给定一个\(n\)个点的带权无根树,求树上异或和最大的一条路径. \(n\le 10^5\) 分析 一个简单的例子 相信大家都做过这题: 给定一个\(n\)个点的带权无根树,有\(m\)个询问, ...

随机推荐

  1. About configuration center of Apollo

    A comparison among different configuration management tools Use of Apollo configuration management p ...

  2. Calendar 日期类介绍

    Calendar c = Calendar.getInstance();//创建实例 默认是当前时刻 c.get(Calendar.YEAR); c.get(Calendar.MONTH); c.ge ...

  3. 彻底解决mysql中文乱码

    mysql是我们项目中非常常用的数据型数据库.但是因为我们需要在数据库保存中文字符,所以经常遇到数据库乱码情况.下面就来介绍一下如何彻底解决数据库中文乱码情况. 1.中文乱码 1.1.中文乱码 cre ...

  4. sql统计字符串出现次数技巧

    在牛客网上看到一道题,感觉挺有趣,是用sql统计字符串出现的次数. 这里提供一种思路,比如统计字符串A中子串B的出现次数: SELECT (LENGTH(A) - LENGTH(REPLACE(A, ...

  5. Verilog笔记.6.FIFO

    FIFO,First In First Out ,是一种先进先出的数据缓存器. 没有外部读写地址线,只能顺序写入数据,顺序的读出数据, 其数据地址由内部读写指针自动加1完成. 不能像普通存储器那样可以 ...

  6. 仿阿里云后台管理界面模板html源码——后台

    链接:http://pan.baidu.com/s/1nuH2SPj 密码:ar8o

  7. Linux 内核进程管理之进程ID【转】

    转自:http://www.cnblogs.com/hazir/p/linux_kernel_pid.html Linux 内核使用 task_struct 数据结构来关联所有与进程有关的数据和结构, ...

  8. 简单实现JS上传图片预览功能

    HTML代码 <div class="upload"> <input type="button" class="btn" ...

  9. 5.Python3标准库-日期和时间

    ''' 不同于int,str,float,Python没有包含对应日期和时间的原生类型,不过提供了3个相应的模块,可以采用多种表示来管理日期和时间值 time模块由底层C库提供与时间相关的函数.它包含 ...

  10. Java集合里的一些“坑”

    这里主要谈下Java集合在使用中容易被忽略.又容易出现的两个“坑”,一个是集合与数组互相转换,另一个是集合遍历删除.主要通过代码演示. 一.集合与数组互相转换中的“坑” //Test1.java pa ...