题意

传送门 POJ 3764

题解

考虑异或最长路径经过节点 iii,以 iii 为起点 dfsdfsdfs,求至多两条以不同节点为终点的路径(考虑权值为零的路径)的异或最大值即可;若异或最长路径不经过节点 iii,设其为 pathjkpath_{jk}pathjk​,考虑异或的性质 x⊕x=0x\oplus x=0x⊕x=0 以及树的性质,则 pathijpath_{ij}pathij​ 与 pathikpath_{ik}pathik​ 的公共路径异或值为零,pathij⊕pathik=pathjkpath_{ij}\oplus path_{ik}=path_{jk}pathij​⊕pathik​=pathjk​,转化为与第一种情况一样的形式。

假设已知异或最大路径 pathjkpath_{jk}pathjk​ 其中一段为 pathijpath_{ij}pathij​,那么可以枚举第二条路径,复杂度为 O(n2)O(n^2)O(n2),显然是不行的;使用 TrieTrieTrie 树从高位到低位维护以节点 iii 为起点的路径权值,贪心地希望数字的高位为 111,那么查找时尽量 pathijpath_{ij}pathij​ 这一位的异或方向查询。

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
#define maxl 30
#define maxp 6000005
#define maxn 200005
struct node
{int v, w, nxt;
} es[maxn];
int n, k, e, res, head[maxn], dis[maxn], trie[maxp][2];
bool used[maxn];void add_edge(int u, int v, int w)
{es[e].v = v, es[e].w = w, es[e].nxt = head[u], head[u] = e++;es[e].v = u, es[e].w = w, es[e].nxt = head[v], head[v] = e++;
}void insert(int x)
{int p = 0;for (int i = maxl; i >= 0; i--){int c = (x >> i) & 1;if (!trie[p][c]){trie[p][c] = ++k;trie[k][0] = trie[k][1] = 0;}p = trie[p][c];}
}int query(int x)
{int y = 0, p = 0;for (int i = maxl; i >= 0; i--){int c = (x >> i) & 1;if (trie[p][c ^ 1]){y |= (1 << i), p = trie[p][c ^ 1];}else{p = trie[p][c];}}return y;
}void dfs(int u, int w)
{used[u] = 1, dis[u] = w;for (int i = head[u]; i != -1; i = es[i].nxt){int v = es[i].v, w2 = es[i].w;if (!used[v]){dfs(v, w ^ w2);}}
}int main()
{while (~scanf("%d", &n)){memset(head, -1, sizeof(int) * n);e = 0;for (int i = 1; i < n; i++){int u, v, w;scanf("%d%d%d", &u, &v, &w);add_edge(u, v, w);}memset(used, 0, sizeof(bool) * n);dfs(0, 0);trie[0][0] = trie[0][1] = k = res = 0;insert(0);for (int i = 0; i < n; i++){res = max(res, query(dis[i]));insert(dis[i]);}printf("%d\n", res);}return 0;
}

POJ 3764 Trie + 贪心相关推荐

  1. Trie:hdu 4825、1251、1247、Poj 3764

    hdu 4825链接 题目意思很简单,就是要求最大异或值的数. 我们可以从二进制的最高位开始选择,不断的排除一些数.我们先假设存在某些数字的二进制数是与当前查找的数不一样的,我们进入这一部分数进行查找 ...

  2. POJ 3764 Language: The xor-longest Path (01字典树+DFS)

    传送门:POJ 3764 题目大意: 在树上找一段路径(连续)使得边权相异或的结果最大. 前置技能: 1.用链式前向星建图. 2. 01字典树的应用. 思路: 本题用 vector数组建图是会超时的, ...

  3. E. XOR Inverse(Trie贪心)

    E. XOR Inverse(Trie&贪心) 思路:异或Trie+Trie+Trie+贪心. 考虑一个性质:两个数的大小只需比较其最高位. 因此考虑将数的每位从高到低存入字典树,显然一个结点 ...

  4. poj 1456 Supermarket 贪心+并查集(个人感觉有点难判断出来

    poj 1456 这第一眼还觉得只要贪心就可以了,但是emmm看了大佬的题解居然真的要用到并查集= = 大佬清晰的思路 大佬舒服的代码 #pragma warning(disable:4996) #i ...

  5. Poj 圣诞老人的礼物 贪心

    圣诞节?快乐^ - ^ POJ 4110 圣诞老人的礼物(贪心) 描述 圣诞节来临了,在城市A中圣诞老人准备分发糖果,现在有多箱不同的糖果,每箱糖果有自己的价值和重量,每箱糖果都可以拆分成任意散装组合 ...

  6. poj 1456 Supermarket (贪心, 并查集)

    链接: http://poj.org/problem?id=1456 题目: Description A supermarket has a set Prod of products on sale. ...

  7. poj 2001 trie

    第一道trie 还需要写题来建立自己的代码习惯. 1 #include <cstdio> 2 #include <vector> 3 #include <algorith ...

  8. poj 1230(贪心)

    解题思路:这道题目是用贪心的思想,从左向右扫描场地的每一列是否合法.若不合法,贪心的找出从该列起向右延伸最长的m道墙,移除这m道墙使得该列合法. 我最开始代码会出现这样的问题:如果两个墙是连在一起的, ...

  9. BZOJ4567 SCOI2016背单词(trie+贪心)

    倒过来变成查询前缀.考虑怎么排序.第一条代价n*n就相当于inf,说明一个单词的所有前缀都要排在它前面.那么串的依赖关系就是trie的结构.二三条说明代价是Σidi-idfa,那么显然最后的编号应该是 ...

  10. POJ - 3614 Sunscreen(贪心/二分图最大匹配-多重匹配/网络流-最大流)

    题目链接:点击查看 题目大意:给出n头奶牛,奶牛们现在要晒太阳,每头奶牛需要[l,r]区间内的光照强度,现在有m种防晒霜,每种防晒霜可以让奶牛接受到val数值的光照强度,然后每种防晒霜只有num个,现 ...

最新文章

  1. python -- 青少年如何使用 Python 开始游戏开发
  2. UVA 11255 Necklace
  3. Problem 60 关于解决X11的错误的问题?
  4. 2017 ACM/ICPC Asia Regional Xian Online 记录
  5. linux下mysql无法看到3306端口监听
  6. mysql数据库 数据类型自动编号选哪个_MySQL表类型、选择合适数据类型、字符集...
  7. vue的插值语法及el和data、methods语法释义
  8. Xamarin使XRPC实现接口/委托远程调用
  9. docker启动sqlserver_Docker搭建SQLServer
  10. 卖萌屋算法工程师思维导图part3—深度学习篇
  11. 测试思想-验收测试 关于验收测试
  12. 树分类、线性回归和树回归的感性认知
  13. linux内存源码分析 - 伙伴系统(初始化和申请页框)
  14. Atitit 下推自动机﹙PDA﹚说明书 目录 1. 概念组成与原理成分 1 2. 性状 1 3. 适用场景 主治 适应症 1 3.1. 所有场景()。 1 3.2. 语法解析 构建ast 2 3.
  15. 乌班图系统部署jdk
  16. 设置部署服务器的运行端口,以太坊swarm配置bzz运行常见问题解决方案
  17. 量子计算机epr,从EPR到量子信息[转] - 物理 - 小木虫 - 学术 科研 互动社区
  18. 1901~2100年节气表
  19. 【docker详解02】-docker安装
  20. React--》UI组件库ant-design的介绍与使用

热门文章

  1. 认知神经科学技术革命
  2. 形容谣言的四字词语_四字词语加解释大全
  3. fastnest怎么一键排版_文字一键排版工具,排版助手(gidot typesetter)使用攻略
  4. Excel: 批量去除空格的函数——trim函数, substitute函数,clean函数
  5. 本地微信公众号授权登录获取code步骤
  6. 2022-01-08:数组中只有0和1,每过1代,0旁边只有1个1,当前0会变成1。每过1代,0旁边有2个1,当前0还是0。 比如10001,经过1代,会变成11011,再过1代,还是11011 。
  7. 科普:什么是IPV4?什么是IPV6?
  8. The command ‘docker‘ could not be found in this WSL 2 distro.
  9. Tor源码 -- 启动模块
  10. 技术美术知识学习4200:SSAO算法