P4551 最长异或路径

最长异或路径

题目描述

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

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

输入格式

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

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

输出格式

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

样例 #1

样例输入 #1

4
1 2 3
2 3 4
2 4 6

样例输出 #1

7

提示

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

数据范围

1 ≤ n ≤ 100000 ; 0 < u , v ≤ n ; 0 ≤ w < 2 31 1\le n \le 100000;0 < u,v \le n;0 \le w < 2^{31} 1n100000;0<u,vn;0w<231
插入
在这里插入图片描述

代码:

//每条路径 <a,b> 的 xor 和转化成 “(a 到根的 xor 和) xor (b 到根的 xor 和)”
#include<bits/stdc++.h>
using namespace std;
struct node{
    int left=0,right=0;
}root;
vector<node> trie;
vector<int> a[100001],b[100001];//连接情况记录在a数组,权重情况记录在b数组
int yihuo[100005];//搜索异或值的结果
//通过dfs搜出所有节点到根节点的异或值
void dfs(int x,int y){//x代表节点,y代表当前的异或值是多少
    for(int i=0;i<a[x].size();i++){
        yihuo[a[x][i]]=y^b[x][i];//当前异或值异或连接到的节点的权重
        dfs(a[x][i],yihuo[a[x][i]]);//继续往下搜
    }
}
//生成01字典树
void build(int x){//记录各个节点的左右节点编号,这里默认左节点储存0,右节点储存1
    int fa=0,len;//每次重新输入一个异或值生成01树的时候fa都要重新置0
    for(int i=(1<<30);i>0;i>>=1){//边的权值最大为2的31次方,说明边权的异或最大值也是
        len=trie.size();//树的节点
        if(x&i){//当前位为1,遍历右边的
            if(trie[fa].right==0){//没有右节点
                trie[fa].right=len;
                // cout<<fa<<" right "<<len<<endl;
                trie.push_back(root);//把空节点push_back进去
                fa=len;//下一次的父节点为当前的节点编号
            }else fa=trie[fa].right;    
        }else{//当前位为0,遍历左边的
            if(trie[fa].left==0){//没有左节点
                trie[fa].left=len;//给左节点编号
                // cout<<fa<<" left "<<len<<endl;
                trie.push_back(root);
                fa=len;
            }else fa=trie[fa].left;
        }
    }
}
int jisuan(int x){
    int ans=0,fa=0;
    cout<<x<<endl;
    for(int i=(1<<30);i>0;i>>=1){//i的初始值为1<<30是因为边的权值最大为2的31次方
        if(x&i){//当前位为1,由于是要求最长的异或路径,所以需要遍历左边的0,才能使得当前值为1
            if(trie[fa].left){
                ans+=i;
                // cout<<"left "<<ans<<" "<<trie[fa].left<<endl;
                fa=trie[fa].left;
            }
            else fa=trie[fa].right;
        }
        else{//当前位为0,由于是要求最长的异或路径,所以需要遍历右边的1,才能使得当前值为1
            if(trie[fa].right){
                ans+=i;
                // cout<<"right "<<ans<<" "<<trie[fa].right<<endl;
                fa=trie[fa].right;
            }
            else fa=trie[fa].left;
        }
    }
    // cout<<x<<" "<<ans;
    return ans;
}
void lesson1(){
    int n,x,y,z,ans=0;
    cin>>n;
    for(int i=1;i<n;i++){
        cin>>x>>y>>z;
        a[x].push_back(y);
        b[x].push_back(z);
    }
    dfs(1,0);
    trie.push_back(root);//0号节点,其左节点为0号节点,右节点为0号节点
    for(int i=1;i<=n;i++){
        build(yihuo[i]);
        // cin>>x;
        // cout<<x<<endl;
        // build(x);       
    }
    for(int i=1;i<=n;i++){
        ans=max(ans,jisuan(yihuo[i]));
    }
    cout<<ans<<endl;   
    // for(int i=1;i<=n;i++){
    //     cout<<i<<":";
    //     for(int j=0;j<a[i].size();j++)cout<<a[i][j]<<","<<b[i][j]<<" ";
    //     cout<<endl;
    // }
    // for(int i=1;i<=n;i++)cout<<yihuo[i]<<" ";//根据题目样例得到0 3 7 5
    // for(int i=0;i<trie.size();i++){
    //     cout<<i<<":"<<trie[i].left<<","<<trie[i].right<<endl;
    // }
}
int main(){
    lesson1();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/452561.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Threejs粒子水波纹效果

依赖 three&#xff08;这个重要&#xff09;react &#xff08;这个不重要&#xff09;ahooks&#xff08;这个不重要&#xff09;unocss&#xff08;这个不重要&#xff09; 效果 代码 import React, { useEffect, useRef } from react; import { useGetState } from ahoo…

视频AI方案:数据+算力+算法,人工智能的三大基石

背景分析 随着信息技术的迅猛发展&#xff0c;人工智能&#xff08;AI&#xff09;已经逐渐渗透到我们生活的各个领域&#xff0c;从智能家居到自动驾驶&#xff0c;从医疗诊断到金融风控&#xff0c;AI的应用正在改变着我们的生活方式。而数据、算法和算力&#xff0c;正是构…

基于SpringBoot+MYSQL的社区团购系统

目录 1、前言介绍 2、主要技术 3、系统流程分析 3.1、注册流程 3.2、登录流程 3.3、购买流程 4、系统设计 4.1、系统结构设计 4.2、系统顺序图 4.2.1、登录模块顺序图 4.2.2、添加信息模块顺序图 4.3、数据库设计 4.3.1、数据库E-R图设计 4.3.2、数据库表设计 5、…

找不到mfc140u.dll怎么办?修复缺失mfc140u.dll的多种方案分享

mfc140u.dll文件是一个重要的动态链接库文件&#xff0c;它在Windows操作系统中发挥着关键的作用。由于各种原因&#xff0c;例如应用程序冲突或系统错误等&#xff0c;mfc140u.dll文件有时会出现丢失的情况。一旦发生这种问题&#xff0c;运行依赖此文件的应用程序将无法正常启…

(2)(2.12) Robsense SwarmLink

文章目录 前言 1 规格&#xff08;根据制造商提供&#xff09; 2 EasySwarm 3 参数说明 前言 Robsense SwarmLink 遥测无线电可将多架无人机连接到一个地面站&#xff0c;而无需在地面站一侧安装多个无线电&#xff08;即创建一个网状网络&#xff09;。此外&#xff0c;还…

解决vue2+elementUI的下拉框出现自动校验的问题

问题&#xff1a; 总结原因是因为新增的时候&#xff0c;传了空值进去 可以这样子解决 this.formData.value && this.$set(this.model, this.formData.key, this.formData.value)这种是只有值存在的时候才会给他赋值&#xff0c;但是这只解决单选下拉框&#xff0c;…

精读《正交的 React 组件》

1 引言 搭配了合适的设计模式的代码&#xff0c;才可拥有良好的可维护性&#xff0c;The Benefits of Orthogonal React Components 这篇文章就重点介绍了正交性原理。 所谓正交&#xff0c;即模块之间不会相互影响。想象一个音响的音量与换台按钮间如果不是正交关系&#xf…

10、Redis分布式系统之数据分区算法

Redis分布式系统之数据分区算法 1、什么是Redis分布式系统 ​ Redis分布式系统&#xff0c;官方称为Redis Cluster, Redis集群&#xff08;这个集群和前面的主从复制集群不同&#xff0c;这个集群可以理解为是多个主从复制集群所组成的集群&#xff09;&#xff0c;其实是Red…

保研复习数据结构记(4)--树(二叉树、线索树、哈夫曼树,并查集)

一.树的基本术语 1.树 什么是空树&#xff1f;结点数为0的树非空树的特性&#xff1f;有且仅有一个根结点&#xff0c;没有后继的结点称为“叶子结点”&#xff0c;有后继的结点称为“分支结点”&#xff0c;除了根结点外任何一个结点都有且仅有一个前驱&#xff0c;每个结点…

VS 调试Hololens 2工程报错 有未经处理的异常: Microsoft C++ 异常:

原因是unity 少安装了XR工具包 安装完后重新用unity打包&#xff0c;然后vs打开打包出来的工程&#xff0c;电脑和眼镜用usb连接&#xff0c;直接运行调试就可以了

力扣L6--- 两数之和(java版)--2024年3月12日

1.题目 2.知识点 注1&#xff1a;在Java中&#xff0c;数组的长度不是通过调用一个方法获得的&#xff0c;而是通过一个属性直接获得的。因此&#xff0c;正确的语法是nums.length而不是nums.length()。 所以应该使用int m nums.length; 注2&#xff1a;return new int[]{i,…

3DMAX的选择模型高亮显示方式

1、选择时会显示有个外框&#xff0c;J或ShiftJ。 2 首选项设置里有高亮设置 3 就像F4一样&#xff0c;选择时边面显示

Spring Boot Admin服务监控

目录 概述实践server端pom.xml类配置结果clientpom.xml配置 结束 概述 Spring Boot Admin 集权限、日志、异常通知。 实践 server端 pom.xml <!-- SpringBoot Admin --> <dependency><groupId>de.codecentric</groupId><artifactId>spring-…

【算法面试题】-07

小明找位置 题目描述 小朋友出操&#xff0c;按学号从小到大排成一列;小明来迟了&#xff0c;请你给小明出个主意&#xff0c;让他尽快找到他应该排的位置。 算法复杂度要求不高于nLog(n);学号为整数类型&#xff0c;队列规模<10000; 输入描述 1、第一行:输入已排成队列的…

STM32外设分类--学习笔记

简介: 本文在于根据自己的理解&#xff0c;将stm32f103外设按照功能分个类别&#xff0c;便于记忆。下面的几张图一定要熟悉&#xff0c;后期编写代码时能够快速找到想要的功能和对应的引脚。 我使用的工具链是&#xff1a;使用CubeMX完成keil5工程搭建和引脚初始化功能,然后用…

使用Maven打包时出现Please refer to D:路径 for the individual怎么解决?

遇到这种情况不要着急&#xff0c;直接按照下面步骤即可&#xff1a; 解决方法1 可能是你的测试用例里出现了bug&#xff0c;根据下面提示的路径可以找到bug&#xff0c;打开 txt 文件&#xff08;可以每个都打开&#xff0c;不一定是哪个出bug了&#xff09; 去项目中修改完…

LeetCode(力扣)算法题_1261_在受污染的二叉树中查找元素

今天是2024年3月12日&#xff0c;可能是因为今天是植树节的原因&#xff0c;今天的每日一题是二叉树&#x1f64f;&#x1f3fb; 在受污染的二叉树中查找元素 题目描述 给出一个满足下述规则的二叉树&#xff1a; root.val 0 如果 treeNode.val x 且 treeNode.left ! n…

基于pci多功能采集卡——pci9640

一、追逐潮流&#xff0c;应运而生 信息社会的高速发展&#xff0c;在很大程度上取决于信息与信号处理的先进性。数字信号处理技术的出现改变了信号与信号处理技术的整个面貌&#xff0c;而数据采集作为数字信号处理的必不可少的前期工作在整个数字系统中起到关键性乃至决定性的…

C# RAM Stable Diffusion 提示词反推 Onnx Demo

目录 介绍 效果 模型信息 项目 代码 下载 C# RAM Stable Diffusion 提示词反推 Onnx Demo 介绍 github地址&#xff1a;GitHub - xinyu1205/recognize-anything: Open-source and strong foundation image recognition models. Open-source and strong foundation ima…

【Android】源码中的建造者模式

本文是基于 Android 14 的源码解析 在 Android 源码中&#xff0c;最常用到的建造者模式就是 AlertDialog.Builder&#xff0c;使用该建造者来构建复杂的 AlertDialog 对象。在开发过程中&#xff0c;我们经常用到 AlertDialog&#xff0c;具体示例如下&#xff1a; private f…