当前位置: 首页 > news >正文

《P4551 最长异或路径》

题目描述

给定一棵 n 个点的带权树,结点下标从 1 开始到 n。寻找树中找两个结点,求最长的异或路径。

异或路径指的是指两个结点之间唯一路径上的所有边权的异或。

输入格式

第一行一个整数 n,表示点数。

接下来 n−1 行,给出 u,v,w ,分别表示树上的 u 点和 v 点有连边,边的权值是 w。

输出格式

一行,一个整数表示答案。

输入输出样例

输入 #1复制

4
1 2 3
2 3 4
2 4 6

输出 #1复制

7

说明/提示

最长异或序列是 1,2,3,答案是 7=3⊕4。

数据范围

1≤n≤100000;0<u,v≤n;0≤w<231。

代码实现:

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;

const int MAXN = 1e5 + 5;
const int MAXBIT = 30;

// 树的邻接表表示
vector< pair<int, int> > adj[MAXN];
int xor_val[MAXN]; // 存储每个节点到根的异或和

// Trie树节点结构
struct TrieNode {
    TrieNode* children[2];
    TrieNode() {
        children[0] = 0;  // 使用0替代nullptr
        children[1] = 0;  // 兼容C++98/03
    }
};

TrieNode* root;

// 插入数字到Trie树
void insert(int num) {
    TrieNode* curr = root;
    for (int i = MAXBIT; i >= 0; i--) {
        int bit = (num >> i) & 1;
        if (!curr->children[bit]) {
            curr->children[bit] = new TrieNode();
        }
        curr = curr->children[bit];
    }
}

// 查询与num异或的最大值
int query(int num) {
    TrieNode* curr = root;
    int res = 0;
    for (int i = MAXBIT; i >= 0; i--) {
        int bit = (num >> i) & 1;
        int desired = 1 - bit;
        if (curr->children[desired]) {
            res |= (1 << i);
            curr = curr->children[desired];
        } else {
            curr = curr->children[bit];
        }
    }
    return res;
}

// DFS计算每个节点的异或和
void dfs(int u, int parent) {
    for (int i = 0; i < adj[u].size(); i++) {
        int v = adj[u][i].first;
        int w = adj[u][i].second;
        if (v != parent) {
            xor_val[v] = xor_val[u] ^ w;
            dfs(v, u);
        }
    }
}


int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n - 1; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        // 使用 push_back 和 make_pair 替代 emplace_back
        adj[u].push_back(make_pair(v, w));
        adj[v].push_back(make_pair(u, w));
    }
    
    // 计算每个节点的异或和
    xor_val[1] = 0; // 根节点的异或和为0
    dfs(1, -1);
    
    // 构建Trie树并查询最大异或值
    root = new TrieNode();
    insert(xor_val[1]);
    int max_xor = 0;
    
    for (int i = 2; i <= n; i++) {
        max_xor = max(max_xor, query(xor_val[i]));
        insert(xor_val[i]);
    }
    
    cout << max_xor << endl;
    
    return 0;
}

相关文章:

  • C语言之旅【6】--一维数组和二维数组
  • MyBatis(二)
  • AI Agent开发第70课-彻底消除RAG知识库幻觉(4)-解决知识库问答时语料“总重复”问题
  • 生成树的保护机制
  • 解决 Tailwind CSS 代码冗余问题
  • 功能安全管理
  • ES(ES2023/ES14)最新更新内容,及如何减少内耗
  • 《C++与OpenCV实战:图像增强大核心算法详解》​​
  • 设备预测性维护:从技术架构到工程实践,中讯烛龙如何实现停机时间锐减
  • 玄机-第二章日志分析-redis应急响应
  • Eigen与OpenCV矩阵操作全面对比:最大值、最小值、平均值
  • 时序数据库、实时数据库与实时数仓:如何为实时数据场景选择最佳解决方案?
  • 模拟电路中的电感:从“电磁倔驴“到“电路稳定器“的奇幻漂流
  • TYUT-企业级开发教程-第二章
  • MinIO:从入门到精通,解锁云原生存储的奥秘
  • Linux下 使用 SSH 完成 Git 绑定 GitHub
  • 广域网学习
  • Flink 的水印机制
  • AI大模型学习二十六、使用 Dify + awesome-digital-human-live2d + ollama + ChatTTS打造数字人
  • nginx概念及使用
  • 竞彩湃|英超欧冠悬念持续,纽卡斯尔诺丁汉能否拿分?
  • 国内规模最大女子赛艇官方赛事在沪启航,中外41支队伍逐浪
  • 河南一女子被医院强制带走治疗,官方通报:当值医生停职
  • 国际乒联主席索林:洛杉矶奥运会增设混团是里程碑事件
  • 俄乌直接谈判结束,乌称“毫无成果”
  • 上海比常年平均时间提前12天入夏,明天最高气温可达33℃