题目描述

给定一棵n个点的带权树,结点下标从1开始到N。寻找树中找两个结点,求最长的异或路径。
异或路径指的是指两个结点之间唯一路径上的所有边权的异或。

分析

处理出各个节点到根节点的异或距离,然后我们将这个异或距离放到01字典树中。
考虑一个贪心,我们每次查找都找与目标串当前为相反的,也就是反着跳,如果只有相同的,那么就跳相同。

ac代码

#include <bits/stdc++.h>
#define ll long long
#define ms(a, b) memset(a, b, sizeof(a))
#define inf 0x3f3f3f3f
using namespace std;
template <typename T>
inline void read(T &x) {
    x = 0; T fl = 1;
    char ch = 0;
    while (ch < '0' || ch > '9') {
        if (ch == '-') fl = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = (x << 1) + (x << 3) + (ch ^ 48);
        ch = getchar();
    }
    x *= fl;
}
#define N 100005
struct edge {
    int to, nt, w;
}E[N << 1];
int tr[4000005][3];
int cnt, tot, n, rt;
int H[N], dist[N];
bool vis[N];
void add_edge(int u, int v, int w) {
    E[++ cnt] = (edge){v, H[u], w};
    H[u] = cnt;
}
void dfs(int u, int dis) {
    vis[u] = 1;
    dist[u] = dis;
    for (int e = H[u]; e; e = E[e].nt) {
        int v = E[e].to;
        if (vis[v]) continue;
        dfs(v, dis ^ E[e].w);
    }
}
void insert(int x) {
    int p = 1;
    for (int i = 30; i >= 0; i --) {
        int k = (x >> i) & 1;
        if (tr[p][k] == 0) tr[p][k] = ++tot;
        p = tr[p][k];
    }
}
int find(int x) {
    int p = 1, res = 0;
    for (int i = 30; i >= 0; i --) {
        int k = (x >> i) & 1;
        if (tr[p][k ^ 1] != 0) {
            res += (1 << i);
            p = tr[p][k ^ 1];
        }
        else p = tr[p][k];
    }
    return res;
}
int main() {
    ms(vis, 0);
    read(n);
    rt = 1;
    for (int i = 1; i < n; i ++) {
        int u, v, w;
        read(u); read(v); read(w);
        add_edge(u, v, w);
        add_edge(v, u, w);
    }
    dfs(rt, 0);
    int ans = 0;
    tot = 1;
    for (int i = 1; i <= n; i ++) {
        insert(dist[i]);
        ans = max(ans, find(dist[i]));
    }
    printf("%d\n", ans);
    return 0;
}

[luogu4551][POJ3764]最长异或路径的更多相关文章

  1. [POJ3764]最长异或路径

    Description: 给定一棵n个点的带权树,结点下标从1开始到N.寻找树中找两个结点,求最长的异或路径. Hint: \(n<=10^5\) Solution: 真是01Trie傻逼题,居 ...

  2. [luogu] P4551 最长异或路径(贪心)

    P4551 最长异或路径 题目描述 给定一棵\(n\)个点的带权树,结点下标从\(1\)开始到\(N\).寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或 ...

  3. luoguP4551最长异或路径

    P4551最长异或路径 链接 luogu 思路 从\(1\)开始\(dfs\)求出\(xor\)路径.然后根据性质\(x\)到\(y\)的\(xor\)路径就是\(xo[x]^xo[y]\) 代码 # ...

  4. 【ybt高效进阶2-4-3】【luogu P4551】最长异或路径

    最长异或路径 题目链接:ybt高效进阶2-4-3 / luogu P4551 题目大意 给定一棵 n 个点的带权树,结点下标从 1 开始到 N.寻找树中找两个结点,求最长的异或路径. 异或路径指的是指 ...

  5. 01Trie【p4551(poj3764)】 最长异或路径

    题目描述 给定一棵 n 个点的带权树,结点下标从 1 开始到 N .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 个人: 首先强推一下01字典树(T ...

  6. P4551 最长异或路径

    题目描述 给定一棵 nnn 个点的带权树,结点下标从 111 开始到 NNN .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 输入输出格式 输入格式 ...

  7. 洛谷 P4551 最长异或路径

    题目描述 给定一棵 nn 个点的带权树,结点下标从 11 开始到 NN .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有节点权值的异或. 输入输出格式 输入格式: ...

  8. P4551 最长异或路径 (01字典树,异或前缀和)

    题目描述 给定一棵 n 个点的带权树,结点下标从 1 开始到 N .寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 输入输出格式 输入格式: 第一行一 ...

  9. Luogu P4551 最长异或路径

    题目链接 \(Click\) \(Here\) \(01Trie\)好题裸题. 取节点\(1\)为根节点,向下扫每一个点从根节点到它路径上的异或和,我们可以得到一个\(sumx[u]\). 现在路径异 ...

随机推荐

  1. 如何实现.net程序的进程注入

    原文:如何实现.net程序的进程注入   如何实现.net程序的进程注入                                   周银辉 进程注入比较常见,比如用IDE调试程序以及一些Sp ...

  2. MiniProfiler工具介绍(监控EF生成的SQL语句)--EF,迷你监控器,哈哈哈

    十年河东,十年河西,莫欺少年穷... 今天是抄袭的别人的博客,不过我感觉蛮好,挺有用,特别是老板让你优化EF项目SQL耗时的情况下,你可以采用这种方式来优化你的LINQ. 时间很宝贵,废话还是不多说, ...

  3. Scala学习(六)---Scala对象

    Scala中的对象 摘要: 在本篇中,你将会学到何时使用Scala的object语法结构.在你需要某个类的单个实例时,或者想为其他值或函数找一个可以挂靠的地方时,你就会用到它.本篇的要点包括: 1. ...

  4. hibernate 4 需要导入的jar包

    <!-- 下面是导入 hibernate 必须的 jar 包 --> <!-- https://mvnrepository.com/artifact/antlr/antlr --&g ...

  5. 【C++】std::是什么?

    引例: #include<iostream> int main() { std::cout<<"我喜欢C++";//输出一句话 std::cout<& ...

  6. [Entity Framework+MVC复习总结1]-WebForm与Asp.Net MVC

    一.Web开发方式的比较 二.web Form开发模型 WebForm开发优点: 1.支持事件模型开发.得益于丰富的服务器端组件,webfrom开发可以迅速的搭建web应用 2.使用方便,入门容易 3 ...

  7. mybatis 思考

    https://my.oschina.net/xianggao/blog/548579 https://my.oschina.net/xianggao/blog/548873 https://my.o ...

  8. WordPress更新提示无法创建目录的解决方案

    上一篇我们说到无法连接FTP服务器,我们已经完美的解决了,然后...发现...还是无法更新,啥情况??? 提示为无法创建目录 原因是执行更新程序的是www用户, 解决方案如下: 需要把插件或主程序下载 ...

  9. Webpack 2 视频教程 007 - 配置 WDS 进行浏览器自动刷新

    原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...

  10. M1/M2 总结

    时光是一列不会回头的列车. 这一学期这么快就过去了,当时刚开始软件工程的那些日子还历历在目.不知道那些如风般过去的日子带给我了什么.然而我又清楚地认识到自己已经改变了. 刚开始软件工程的时候,我对团队 ...