「POJ 3764」The xor-longest Path

给定一棵 N 个节点的树,树上的每条边都有一个权值。从数中选择两个点 x 和 y ,把从 x 到 y 路径上的所有边权 xor 起来,得到的结果最大是多少?

POJ3764

分析

显然, \(d[u]=d[fa_u] \ xor \ w_{u,fa_u}\) ,于是我们可以通过一遍 bfs 来求出每个节点到根节点的 d[i] 。

然后问题转化为求出最大的 \(d[u] \ xor \ d[v]\) 。

根据 xor 运算的性质:相同为 0 ,不同为 1 。我们可以用一棵 trie 树将 d[i] 的二进制位储存下来,并贪心的在 trie 树中寻找与当前位的数值相反的数,如果有,则跳到相反数中;如果没有,则跳到相同的数中,然后求出寻找过程中得到二进制数与当前数的 xor 值,最后取 max 就好了。

一些废话:这道题改了我半天,然后又对着标程改,发现没毛病......只是这个标程有点烦,是用的多组测试数据的输入格式,在 WA 了 INF 遍后,重新看题,发现题目就是多组测试数据......怎么就不给一个多组测试数据的样例呢......

代码

//=========================
//  author:tyqs
//  date:2019.12.7
//  website:http://tyqs.kim
//=========================
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 100003
#define il inline
#define re register
#define tie0 cin.tie(0),cout.tie(0)
#define fastio ios::sync_with_stdio(false)
#define File(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout)
using namespace std;
typedef long long ll;

template <typename T> inline void read(T &x) {
    T f = 1; x = 0; char c;
    for (c = getchar(); !isdigit(c); c = getchar()) if (c == '-') f = -1;
    for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
    x *= f;
}

struct edge {
    int to, nxt, val;
} e[N<<1];

int n, ans;
int head[N<<1], cnt, d[N];
int trie[N*32][2], tot;

void dfs(int u, int fa) {
    for (int i = head[u]; i; i = e[i].nxt) {
        int v = e[i].to, w = e[i].val;
        if (v == fa) continue;
        d[v] = d[u] ^ w;
        dfs(v, u);
    }
}

void insert(int u, int v, int w) {
    e[++cnt] = (edge){v, head[u], w};
    head[u] = cnt;
}

void insert_trie(int x) {
    int p = 1;
    for (int i = 30; i >= 0; --i) {
        int c = x >> i & 1;
        if (!trie[p][c]) trie[p][c] = ++tot;
        p = trie[p][c];
    }
}

int search(int x) {
    int p = 1, ret = 0;
    for (int i = 30; i >= 0; --i) {
        int c = x >> i & 1;
        if (!trie[p][c^1]) p = trie[p][c];
        else ret |= (1 << i), p = trie[p][c^1];
    }
    return ret;
}

int main() {
    int u, v, w;
    while (~scanf("%d", &n)) {
        memset(head, 0, sizeof head);
        memset(d, 0, sizeof d);
        memset(trie, 0, sizeof trie);
        cnt = ans = 0; tot = 1;
        for (int i = 1; i < n; ++i) {
            read(u), read(v), read(w);
            insert(u, v, w), insert(v, u, w);
        }
        dfs(u, -1);
        tot = 1;
        for (int i = 0; i < n; ++i) {
            insert_trie(d[i]);
            ans = max(ans, search(d[i]));
        }
        printf("%d\n", ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/hlw1/p/12260610.html

时间: 2024-08-03 07:15:03

「POJ 3764」The xor-longest Path的相关文章

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

The xor-longest Path Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10038   Accepted: 2040 Description In an edge-weighted tree, the xor-length of a path p is defined as the xor sum of the weights of edges on p: ⊕ is the xor operator. W

「POJ 3268」Silver Cow Party

更好的阅读体验 Portal Portal1: POJ Portal2: Luogu Description One cow from each of N farms \((1 \le N \le 1000)\) conveniently numbered \(1 \cdots N\) is going to attend the big cow party to be held at farm #X \((1 \le X \le N)\). A total of \(M (1 \le M \l

poj 3764 The xor-longest Path(字典树)

题目链接:poj 3764 The xor-longest Path 题目大意:给定一棵树,每条边上有一个权值,找出一条路径,使得路径上权值的亦或和最大. 解题思路:dfs一遍,预处理出每个节点到根节点路径的亦或和rec,那么任意路径均可以表示rec[a] ^ rec[b],所以问题 就转换成在一些数中选出两个数亦或和最大,那么就建立字典树查询即可. #include <cstdio> #include <cstring> #include <algorithm> us

【vuejs面试题】务必熟知的vuejs面试题「务必收藏」

如果能帮到你,点个赞吧,务必熟知的vuejs面试题「务必收藏」 vuejs 基础必备 1.active-class 是哪个组件的属性?嵌套路由怎么定义 (1).active-class 是 vue-router 模块的 router-link 组件的属性 (2).使用 children 定义嵌套路由 2.怎么定义 vue-router 的动态路由? 怎么获取传过来的值 在 router 目录下的 index.js 文件中,对 path 属性加上 /:id. 使用 router 对象的 param

微信小程序开发基础(一)「配置」与「逻辑层」

微信小程序作为微信生态重要的一环,在实际生活.工作.商业中的应用越来越广泛.想学习微信小程序开发的朋友也越来越多,本文将在小程序框架的基础上就微信小程序项目开发所必需的基础知识及语法特点进行了详细总结和阐述,包括配置.函数.语法.事件及其处理.数据绑定.模块.样式等.想开发小程序,这些内容是必须掌握的. 全文知识结构预览: 一.程序配置: 1.全局配置:2.页面配置 二.逻辑层: 1.程序注册:App()方法:2.页面注册:Page()方法:3.模块与调用:4.微信原生API 三.视图层(将在单

[转帖]「日常小记」linux中强大且常用命令:find、grep

「日常小记」linux中强大且常用命令:find.grep https://zhuanlan.zhihu.com/p/74379265 在linux下面工作,有些命令能够大大提高效率.本文就向大家介绍find.grep命令,他哥俩可以算是必会的linux命令,我几乎每天都要用到他们.本文结构如下: find命令 find命令的一般形式 find命令的常用选项及实例 find与xargs grep命令 grep命令的一般形式 grep正则表达式元字符集(基本集) grep命令的常用选项及实例 1.

怎样将「插件化」接入到项目之中?

本期移动开发精英社群讨论的主题是「插件化」,上网查了一下,发现一篇 CSDN 博主写的文章<Android 使用动态载入框架DL进行插件化开发>.此处引用原作者的话: 随着应用的不断迭代,应用的体积不断增大,项目越来越臃肿,冗余添加.项目新功能的加入,无法确定与用户匹配性,发生严重异常往往牵一发而动全身,仅仅能紧急公布补丁版本号,强制用户进行更新.结果频繁的更新.反而easy减少用户使用黏性,或者是公司业务的不断发展,同系的应用越来越多,传统方式须要通过用户量最大的主项目进行引导下载并安装.

「C语言」常量和变量的表示及应用

先发布,还在修改完善中.. 在程序运行中,其值不能改变的量成为常量.在基本数据类型中,常量可分为整型常量.实型常量.符号常量和字符型常量(包括字符常量和字符串常量),现分别介绍如下: 整型常量 即整常数,由一个或多个数字组成,可以带正负号 C语言中整型常量可用十进制.八进制和十六进制3种形式表示 十进制整数:由0~9数字组成,不能以0开始,没有前缀 八进制整数:以0为前缀,其后由0~7的数字组成,没有小数部分 十六进制整数:以0x或0X开头,其后由0~9的数字和a~f(或A~F字母组成) 另外长

Chrome 扩展 Stylish :给不喜欢某个网站一键「换肤」

原文地址:http://whosmall.com/?post=419 本文标签: Chrome扩展 Chrome浏览器 Chrome插件 Chrome扩展Stylish Stylish是什么 Stylish 是什么? 开门见山,Stylish 的作用是,它可以把百度首页变成这样: 它还能把知乎「拍扁」,让微博网页版变得简洁无比,让 Feedly 用上Material Design-- 这个神奇的 Stylish实际上是一个浏览器插件,适用于 Chrome,Firefox,Opera 以及 Saf