POJ 3764 DFS+trie树
题意:
给你一棵树,求树中最长的xor路径。(n<=100000)
思路:
首先我们知道 A xor B =(A xor C) xor (B xor C)
我们可以随便选一个点DFS 顺便做出与这个点连接的其它点的xor长度
但是
枚举起点&重点+判断会TLE
所以呢 随后 就是重头戏了:trie树
这是一棵神奇的树 (莫名想到了“这是一个神奇的网站”)
我们可以从高位往低位插这个点的xor的值。(数字前面可以补零)
之后是查找 由于异或的性质,我们可以得到:当此位数字不相同时 xor得到的值最大,那不就好说了嘛。
每回寻找树上有没有与这一位不相同的值的节点
1.若有,w|=(1 << i) 。按此方向向下寻找
2.若没有,继续顺着trie树往下走
注意是多case。
注意清空数组,ans、归零什么的
PoPoQQQ大爷在这里都有惨痛的经历。
// by SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 305000
using namespace std;
int first[N],next[N],v[N],w[N],W[N],trie[N*10][2];
int xx,yy,zz,n,tot,cnt,ans;
bool vis[N];
void add(int x,int y,int z){
v[tot]=y,w[tot]=z;
next[tot]=first[x],first[x]=tot++;
}
void dfs(int x){
for(int i=first[x];~i;i=next[i])
if(!vis[v[i]]){
vis[v[i]]=1;
W[v[i]]=W[x]xor w[i];
dfs(v[i]);
}
}
void insert(int x){
int jy=0;
for(int i=30;i>=0;i--){
int temp=x&(1<<i)?1:0;
if(trie[jy][temp]==0)
trie[jy][temp]=++cnt;
jy=trie[jy][temp];
}
}
int find(int x){
int jy=0,w=0;
for(int i=30;i>=0;i--){
int temp=x&(1<<i)?1:0;
if(trie[jy][!temp])
w|=(1<<i),jy=trie[jy][!temp];
else jy=trie[jy][temp];
}
return w;
}
int main(){
while(~scanf("%d",&n)){
memset(first,-1,sizeof(first));
memset(trie,0,sizeof(trie));
memset(vis,0,sizeof(vis));
memset(W,0,sizeof(W));
ans=tot=cnt=0;
for(int i=1;i<n;i++){
scanf("%d%d%d",&xx,&yy,&zz);
add(xx,yy,zz),add(yy,xx,zz);
}
dfs(xx);
for(int i=0;i<n;i++)insert(W[i]),ans=max(ans,find(W[i]));
printf("%d\n",ans);
}
}
万朵红中一点蓝。
POJ 3764 DFS+trie树的更多相关文章
- poj3764(dfs+Trie树+贪心)
题目链接:http://poj.org/problem?id=3764 分析:好题!武森09年的论文中有道题CowXor,求的是线性结构上的,连续序列的异或最大值,用的办法是先预处理出前n项的异或值, ...
- POJ 2418 简单trie树
Hardwood Species Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 21845 Accepted: 8551 De ...
- Colored Sticks POJ - 2513(trie树欧拉路)
题意: 就是无向图欧拉路 解析: 不能用map..超时 在判断是否只有一个联通的时候,我比较喜欢用set,但也不能用set,会超时,反正不能用stl emm 用trie树来编号就好了 #include ...
- POJ - 3764 01字典树+前缀异或和
异或关于前缀的特性:[u,v]=[1,u]^[1,v] 注意是路径,假设1为根,prexor[1]不保留数值 /*H E A D*/ int to[maxn<<1],nxt[maxn< ...
- [POJ] #1002# 487-3279 : 桶排序/字典树(Trie树)/快速排序
一. 题目 487-3279 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 274040 Accepted: 48891 ...
- POJ 3764 - The xor-longest Path - [DFS+字典树变形]
题目链接:http://poj.org/problem?id=3764 Time Limit: 2000MS Memory Limit: 65536K Description In an edge-w ...
- POJ 3764 The xor-longest Path trie树解决位运算贪心
http://poj.org/problem?id=3764 题意 : 一颗树,每个边有个值,在树上找一条简单路径,使得这条路径上的边权异或值最大 先找到所有节点到一点的距离 , 显然dis( x ...
- Poj 3764 The xor-longest Path(Trie树+xor+贪心)
The xor-longest Path Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6455 Accepted: 1392 ...
- poj 3764 The xor-longest Path(字典树)
题目链接:poj 3764 The xor-longest Path 题目大意:给定一棵树,每条边上有一个权值.找出一条路径,使得路径上权值的亦或和最大. 解题思路:dfs一遍,预处理出每一个节点到根 ...
随机推荐
- 重温前端基础之-css浮动与清除浮动
文档流的概念指什么?有哪种方式可以让元素脱离文档流? 文档流,指的是元素排版布局过程中,元素会自动从左往右,从上往下的流式排列.并最终窗体自上而下分成一行行,并在每行中按从左到右的顺序排放元素.脱离文 ...
- 关于VS 2013连接Microsoft Access 2013的相关问题
① 下载安装Microsoft Access Database Engine 2010 Redistributable(28MB),共有32bit(下载)和64bit(下载)两个版本,具体要安 ...
- java 简单工厂模式实现
简单工厂模式:也可以叫做静态工厂方法,属于类创建型模式,根据不同的参数,返回不同的类实现. 主要包含了三个角色: A.抽象产品角色 一般用接口 或是 抽象类实现 B.具体的产品角色,具体的类的实现 C ...
- 传入class、id name 的函数封装
function chooseDate(idName){ 2 $('#' + idName).click(function(){ //执行函数 4 }); 5 }; 6 //传入的 dataOne 就 ...
- 如何在CentOS 7中禁止IPv6(转载)
最近,我的一位朋友问我该如何禁止IPv6.在搜索了一番之后,我找到了下面的方案.下面就是在我的CentOS 7 迷你服务器禁止IPv6的方法. 你可以用两个方法做到这个. 方法 1 编辑文件/etc/ ...
- appium不能获取webview内容的解决办法
在用appium对小猿搜题app进行自动化测试时,准备用page_source打印出文章的xml内容 但是发现只能打印出外部结构内容,实际的文章内容却没有显示 截图如下 查询之后,得知需要通过cont ...
- MYSQL数据库常用的LINUX命令
此为我工作中常用MYSQL数据库命令 LINUX系统中启动 / 重启MYSQL服务:service mysql start / service mysql restart(重启服务) LINUX系 ...
- maven构建本地jar包到本地仓库
maven命令: mvn:install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=1.0 -Dpackaging ...
- MySQL SQL模式特点汇总
前言 MySQL服务器可以在不同的SQL模式下运行,并且可以针对不同的客户端以不同的方式应用这些模式,具体取决于sql_mode系统变量的值.DBA可以设置全局SQL模式以匹配站点服务器操作要求,并且 ...
- mknod指令详解
mknod - make block or character special filesmknod [OPTION]... NAME TYPE [MAJOR MINOR] option 有用的 ...