AcWing 3555:二叉树(多次询问两个结点之间的最短路径长度) ← DFS

【题目来源】
https://www.acwing.com/problem/content/3558/

【题目描述】
给定一个 n 个结点(编号 1∼n)构成的二叉树,其根结点为 1 号点。
进行 m 次询问,每次询问两个结点之间的最短路径长度。
树中所有边长均为 1。

【输入格式】
第一行包含一个整数 T,表示共有 T 组测试数据。
每组数据第一行包含两个整数 n,m。
接下来 n 行,每行包含两个整数,其中第 i 行的整数表示结点 i 的子结点编号。如果没有子结点则输出 −1。
接下来 m 行,每行包含两个整数,表示要询问的两个结点的编号。

【输出格式】
每组测试数据输出 m 行,代表查询的两个结点之间的最短路径长度。

【数据范围】
1≤T≤10,
1≤n,m≤1000

【输入样例】
1
8 4
2 3
4 5
6 -1
-1 -1
-1 7
-1 -1
8 -1
-1 -1
1 6
4 6
4 5
8 1

【输出样例】
2
4
2
4

【算法分析】

此算法分析来源于:https://www.acwing.com/solution/content/127225/

本题用 le,ri 数组存储每个结点的左右儿子,用 fa 数组表示子结点的父节点,用 dep 数组表示每个结点的深度并用 dfs 初始化每个结点的深度。

推导任意两个结点直接的最短距离公式:
(1)设原有方案是两个结点都往上寻找公共祖先节点,如果不是这么做,那么一定至少有一步是往下寻找的,这样一定会导致原有方案至少多出两步,所以
往上寻找一定是最优解。
(2)要找到两个结点的最近公共祖先节点,就如题目 
https://www.acwing.com/problem/content/description/3435/ 一样。哪个结点的深度更大,那么就让哪个结点优先找它的父结点
(3)最短距离公式:mind =
两个结点到最近公共祖先结点深度差的和

【算法代码】

#include<bits/stdc++.h>
using namespace std;const int maxn=1005;
int le[maxn], ri[maxn];
int fa[maxn], dep[maxn];
int n,m;void dfs(int u) {if(u==-1) return;if(le[u]>0) dep[le[u]]=dep[u]+1;if(ri[u]>0) dep[ri[u]]=dep[u]+1;dfs(le[u]);dfs(ri[u]);
}int main() {int T;cin>>T;while(T--) {cin>>n>>m;fa[1]=1;for(int i=1; i<=n; i++) {int a,b;cin>>a>>b;le[i]=a, ri[i]=b;if(a>0) fa[a]=i;if(b>0) fa[b]=i;}dfs(1);while(m--) {int a,b;cin>>a>>b;int x=a;int y=b;while(x!=y) {if(dep[x]>dep[y]) x=fa[x];else y=fa[y];}cout<<dep[a]+dep[b]-dep[x]*2<<endl;}}return 0;
}/*
in:
1
8 4
2 3
4 5
6 -1
-1 -1
-1 7
-1 -1
8 -1
-1 -1
1 6
4 6
4 5
8 1out:
2
4
2
4
*/






【参考文献】
https://www.acwing.com/solution/content/127225/
https://www.acwing.com/solution/content/126883/
https://www.acwing.com/solution/content/127139/



 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为云cce容器管理中的调度策略作用

研究不深&#xff0c;但是这个还是挺重要的&#xff0c;在这里记录一下。 在cce节点集群中&#xff0c;有时候会发现有的节点实例过于饱满&#xff0c;有的又有些空&#xff0c;导致部分节点由于压力过大&#xff0c;存在崩溃的危险&#xff0c;这时候调度策略就有用了。 我这…

图扑参展高交会-全球清洁能源创新博览会

“相聚鹏城深圳&#xff0c;共享能源盛宴” 第二十五届中国国际高新技术成果交易会(简称“高交会”)于 11 月 15-18 日在深圳盛大开幕。高交会由商务部、科学技术部、工业和信息化部、国家发展改革委、农业农村部、国家知识产权局、中国科学院、中国工程院和深圳市人民政府共同…

nvm for windows使用与node/npm/yarn的配置

1 下载 nvm for windows download – github 下拉到Assets, 下载.exe文件 2 安装 安装到如下文件夹中 目录可以自己选, 可以换别的名字, 自己记住即可 新手建议全部看完再进行个人配置, 或者使用与博主一致的路径 D:\DevelopEnvironment\nvm3 配置nvm使用的镜像 node_mir…

值得收藏的免费好用API

短信验证码&#xff1a;可用于登录、注册、找回密码、支付认证等等应用场景。支持三大运营商&#xff0c;3秒可达&#xff0c;99.99&#xff05;到达率&#xff0c;支持大容量高并发。通知短信&#xff1a;当您需要快速通知用户时&#xff0c;通知短信是最快捷有效的方式。短信…

Carbonyl ,一个可以在终端里运行的浏览器

浏览器对于我们的日常来说是使用频率比较高的一个东西。 一般来说&#xff0c;对于桌面的发行版的linux的浏览器&#xff0c;用的比较多的是Firefox浏览器。对于我们日常windows、mac等。常用的有chrome、edge等。 但是&#xff01;在终端里运行一个浏览器&#xff0c;我想大多…

SaaS模式C/S检验科LIS系统源码

适用于医院检验科实际需要的管理系统, 实现检验业务全流程的计算机管理。从检验申请、标本编号、联机采集、中文报告单的生成与打印、质控图的绘制和数据的检索与备份。通过将所有仪器自身提供的端口与科室LIS系统中的工作站点连接,实现与医院HIS系统的对接。 通过门诊医生和住…

HTML-CSS知识速查

HTML/CSS知识速查 文章目录 HTML/CSS知识速查[toc]网页的组成浏览器**为什么需要Web标准&#xff1a;** **web标准的构成&#xff1a;**HTMLHTML语法导读**1.1 HTML语法规则&#xff1a;**1.2 基本结构标签**1.3 标签的关系&#xff1a;**1. **包含关系&#xff08;Parent-Chil…

java并发编程(一)----初识

一、什么是并发 先看“科普中国”给出的官方解释。并发在操作系统中&#xff0c;是指一个时间段中有几个程序都处于已启动运行到运行完毕之间&#xff0c;且这几个程序都是在同一个处理机上运行&#xff0c;但任一个时刻点上只有一个程序在处理机上运行。 通俗来讲&#xff0c…

岩土工程监测新利器——振弦采集仪

岩土工程监测新利器——振弦采集仪 振弦采集仪是一种常用的岩土工程监测仪器&#xff0c;主要用于测量岩土体的振动和应变情况。它采用先进的数字信号处理技术&#xff0c;可以实时采集和处理振弦信号&#xff0c;快速准确地获取岩土体的振动和应变信息。 振弦采集仪具有以下优…

数据结构---树

树概念及结构 1.树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的 有一个特殊的结点&#xff0c…

在很多nlp数据集上超越tinybert 的新架构nlp神经网络模型

在很多nlp数据集上超越tinybert 的新架构nlp神经网络模型 网络结构图测试代码网络结构图 测试代码 import paddle import numpy as np import pandas as pd from tqdm import tqdmclass FeedFroward(paddle.nn.Layer):

java多线程CountDownLatch简单测试

学习java多线程&#xff0c;请同时参阅 Java多线程 信号量和屏障实现控制并发线程数量&#xff0c;主线程等待所有线程执行完毕1 CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后再继续执行。当所有的线程都已经完成任务&#xff0c;然后在CountDownLatch上…

git报错invalid object xxx和unable to read tree xxxxxx

电脑出问题了&#xff0c;导致git仓库像是被损坏了一样&#xff0c;执行git status就会报错unable to read ree&#xff0c;无法正常提交代码至仓库&#xff0c;原因是本地代码仓库.git文件损坏了&#xff0c;无法找到正确的提交历史和路径。 找到了一个解决办法&#xff1a; …

TCP 基本认识

1&#xff1a;TCP 头格式有哪些&#xff1f; 序列号&#xff1a;用来解决网络包乱序问题。 确认应答号&#xff1a;用来解决丢包的问题。 2&#xff1a;为什么需要 TCP 协议&#xff1f; TCP 工作在哪一层&#xff1f; IP 层是「不可靠」的&#xff0c;它不保证网络包的交付…

python .onnx 转 .engine亲测ok

安装tensorRT&#xff1a; 1、下载与电脑中cuda和cudnn版本对应的tensorRT&#xff08;比如我的是TensorRT-8.2.1.8.Windows10.x86_64.cuda-11.4.cudnn8.2&#xff09; 2、打开目录里面有python文件夹&#xff0c;找到对应python版本的whl文件&#xff08;我的是tensorrt-8.2…

SourceInsight - Relation Windows

磨刀不误砍柴工&#xff0c;你使用的工具决定了你的下限。我平时使用较多的代码编辑工具就是SourceInsight&#xff0c;这个工具速度快&#xff0c;操作方便&#xff0c;但处理非常大的项目的性能不是很理想&#xff0c;比如你要是添加整个Linux Kernel的源代码的话。 在使用SI…

怎样做好信用卡汽车分期业务营销

《信用卡汽车分期业务营销》大纲 【课程背景】 信用卡汽车分期业务销售是一种具有潜力的金融服务&#xff0c;通过与汽车经销商的合作&#xff0c;银行可以为消费者提供更多的选择和便利&#xff0c;同时也为自己带来了额外的收入和客户忠诚度。在销售过程中&#xff0c;银行…

html页面多个视频标签时设定只能播放一个视频

html页面经常会出现存在多个视频的情况&#xff0c;点击单个视频时&#xff0c;该视频播放&#xff0c;点击另外一个视频时&#xff0c;需要让正在播放的视频停止&#xff0c;开始播放所点击的新视频。如果不单独设置&#xff0c;就会出现页面同时播放多个视频的情况。 设置代…

什么是requestIdleCallback?和requestAnimationFrame有什么区别?

什么是requestIdleCallback? 我们都知道React 16实现了新的调度策略(Fiber), 新的调度策略提到的异步、可中断&#xff0c;其实就是基于浏览器的 requestIdleCallback和requestAnimationFrame两个API。 在 JavaScript 中&#xff0c;requestIdleCallback 是一个用于执行回调函…

Linguistic Steganalysis in Few-Shot Scenario论文阅读笔记

TIFS期刊 A类期刊 新知识点 Introduction Linguistic Steganalysis in Few-Shot Scenario模型是个预训练方法。 评估了四种文本加密分析方法&#xff0c;TS-CSW、TS-RNN、Zou、SeSy&#xff0c;用于分析和训练的样本都由VAE-Stego生产(编码方式使用AC编码)。 实验是对比在少样…