题意 : 给出一颗无向边构成的树,每一条边都有一个边权,叫你选出一条路,使得此路所有的边的异或值最大。

分析 : 暴力是不可能暴力的,这辈子不可能暴力,那么来冷静分析一下如何去做。假设现在答案的异或值的最大的路的起点和终点分别为 a、b,这个异或值为了方便我用 ⊕(a, b) 表示,那么接下来有一个巧妙的转化 ⊕(a, b) == ⊕(root, a) ^ ⊕(root, b) ,这个转化在 LCA(a, b) == root 的时候明显成立,因为重复的部分会异或两次,相当于没有异或,而LCA(a, b) != root的时候,同样也可以使用上述转化来进行运算,因为这是一棵树,所以最后无论哪两个节点,都至少会有 root 是这两个节点的祖先,因此不必担心 a 和 b 在上述运算出来的结果会有 a 和 b 不联通的情况,那么这题就很好做了,只要从根节点开始DFS,每一次将新节点异或得到新的异或值并丢到字典树里面,这样所有的 ⊕(root, 所有点) 都会到字典树里面去,出来的结果也自然是其中的两个节点一个作为起点一个作为终点出来的路径异或值。表达可能不太好,请见谅,看看代码辅助理解吧……

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<algorithm>
#define LL long long
using namespace std;
;
;
;
int ans;
struct Edge{ int v, Next, weight; };
Edge e[maxn<<];
int Head[maxn];
bool vis[maxn];

inline void Add_Edge(int v, int to, int weight)
{
    e[tot].v = to;
    e[tot].Next = Head[v];
    e[tot].weight = weight;
    Head[v] = tot++;
}

struct Trie
{
    Trie *ch[];
    int v;
    inline void init(){
        ; i<; i++) this->ch[i] = NULL;
        ;
    };
} Heap[maxn<<];
;
Trie *root;
Trie * New()
{
    Heap[node_cnt].init();
    return &Heap[node_cnt++];
}

inline void CreateTrie(int x)
{
    Trie * p = root, *tmp;
    ; i--){
        ;
        if(p->ch[idx] == NULL){
            p->ch[idx] = New();
        }p = p->ch[idx];
    }
    p->v = x;
}

int Query(int x)
{
    Trie *p = root;
    ; i--){
        ;
        ]){
            p = p->ch[idx^];
        }else p = p->ch[idx];
    }
    return (p->v) ^ x;
}
void DFS(int u, int Val)
{
    CreateTrie(Val);///将路径的权值全丢到字典树里面去,代表⊕(root, u)
    vis[u] = true;
    ; i=e[i].Next){
        int v = e[i].v;
        int w = e[i].weight;
        if(!vis[v]){
            ans = max(ans, Query(Val ^ w));///查询更新最值
            DFS(v, Val^w);
        }
    }
}

inline void INIT()
{
    node_cnt = ;
    root = New();
    memset(Head, -, sizeof(Head));
    memset(vis, false, sizeof(vis));
    ans = tot = ;
}

int main(void)
{
    int n;
    while(~scanf("%d", &n)){
        INIT();
        ; i<=n-; i++){
            int u, v, w;
            scanf("%d %d %d" ,&u, &v, &w);
            u++, v++;
            Add_Edge(u, v, w);
            Add_Edge(v, u, w);
        }
        DFS(, );
        printf("%d\n", ans);
    }
    ;
}

瞎 : 想法非常好的题目,利用异或性质转化思想需要学习

POJ 3764 The xor-longest Path ( 字典树求异或最值 && 异或自反性质 && 好题好思想)的更多相关文章

  1. HDU-4825 Xor Sum(字典树求异或最大值)

    题目链接:点此 我的github地址:点此 Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整 ...

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

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

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

    题目链接:poj 3764 The xor-longest Path 题目大意:给定一棵树,每条边上有一个权值.找出一条路径,使得路径上权值的亦或和最大. 解题思路:dfs一遍,预处理出每一个节点到根 ...

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

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

  5. 【POJ 3764】 The xor-longest path

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

  6. HDU--5269 ZYB loves Xor I (字典树)

    题目电波: HDU--5269 ZYB loves Xor I 首先我们先解决 ai xor aj 每个数转化为二进制  我们用字典树统计 每个节点 0 和 1 的出现的个数 #include< ...

  7. CH 1602 - The XOR Largest Pair - [字典树变形]

    题目链接:传送门 描述在给定的 $N$ 个整数 $A_1, A_2,\cdots,A_N$ 中选出两个进行xor运算,得到的结果最大是多少? 输入格式第一行一个整数 $N$,第二行 $N$ 个整数 $ ...

  8. HDU 5715 XOR 游戏 二分+字典树

    XOR 游戏 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5715 Description 众所周知,度度熊喜欢XOR运算(XOR百科). 今天,它 ...

  9. HDU-4825 Xor Sum,字典树好题!

    Xor Sum 一遍A了之后大呼一声好(keng)题!debug了两小时~~~~百度之星资格赛,可以. 题意:给你一个n个元素的数组,m次查询,每次输入一个数k要求从数组中找到一个数与k异或值最大,输 ...

随机推荐

  1. Java多线程学习——wait方法(信号灯法/生产者消费者模式)

    信号灯法:以一个标志位来判断是否执行还是等待 public class TV { private String voice; //内容 private boolean flag=false; //信号 ...

  2. Arm-linux-gcc-4.3.2安装步骤 (转)

    http://blog.chinaunix.net/uid-26119896-id-3302233.html 安装交叉编译工具链: 1.首先以root用户登入 2.复制arm-linux-gcc-4. ...

  3. Web安全测试中常见逻辑漏洞解析(实战篇)

    Web安全测试中常见逻辑漏洞解析(实战篇) 简要: 越权漏洞是比较常见的漏洞类型,越权漏洞可以理解为,一个正常的用户A通常只能够对自己的一些信息进行增删改查,但是由于程序员的一时疏忽,对信息进行增删改 ...

  4. centOs 常用操作

    centos 官网下载:https://www.centos.org/download/从官网下载iso,教程:https://jingyan.baidu.com/article/1876c85279 ...

  5. 华南理工大学 “三七互娱杯” C HRY and Abaas

    https://ac.nowcoder.com/acm/contest/874/C 题目大意是两人俄罗斯轮盘赌 n个位置 有m个子弹 已知哪些位置上有子弹 子弹打出 游戏结束 求第i次扣动扳机游戏才结 ...

  6. [知乎]ARM 到底是什么

    [小宅按]近期公司推出来基于ARM芯片的服务器,本文就一些基本概念,比如ARM, ARM64, ARMv8, ARM7,ARMv7, 64位等让人费解的概念进行了粗浅地分析,涉及的关键字已用粗体标出. ...

  7. MySQL数据库的特点和优势

    MySQL数据库的特点和优势: 1.MySQL性能卓越.服务稳定,很少出现异常宕机. 2.MySQL开放源代码且无版权制约,自主性及使用成本低. 3.MySQL历史悠久,用户使用活跃,遇到问题可以寻求 ...

  8. Android使用adb抓完整Log

    前言     最新项目里一直在做 Android RIL 方面的研究,非常最终项目还是未能解决通信底层模块的问题,但是在使用adb抓log上还是有一些收获的,这里记录一下.   Log分类     A ...

  9. uboot 主Makefile分析

    一. Makefile 配置 1.1. make xxx_config 1.1.1. 笔者实验时是make x210_sd_config a. x210_sd_config是Makefile下的一个目 ...

  10. python3—廖雪峰之练习(三)

    列表生成式练习 请修改列表生成式,通过添加if语句保证列表生成式能正确执行: L1 = ['Hello', 'World', 18, 'Apple', None] L2 = [] for x in L ...