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

洛谷P3884 [JLOI2009] 二叉树问题(详解)c++

题目链接:P3884 [JLOI2009] 二叉树问题 - 洛谷 | 计算机科学教育新生态

   

1.题目解析

1:从8走向6的最短路径,向根节点就是向上走,从8到1会经过三条边,向叶节点就是向下走,从1走到6需要经过两条边,再用向上的边数×2+向下的边数,所以是3*2+2,所以8到6的距离是8,我们可以发现8到6的距离和6到8的距离是不一样的,8到6是8,6到8是7

                                              

2:这道题跟二叉树没什么关系,如果他告诉我们的是树上一条边一条边的形式来让我们建图的话,我们并不知道左右节点,我们都不知道左右节点那该怎么还原二叉树,所以这道题的名字,虽然是二叉树问题,本质上他跟二叉树没什么关系,他如果告诉我们的是u,v表示树上存在一条连接u,v的边这样的信息的话,就不能用二叉树的方式来存储它了,因为我们不知道左右节点,所以我们要不就用链式前向星,要不用vecrot数组,用存树的方式来存这

3:存的时候只用u指向v的这条边就行了,不用存v指向u,他给了我们两条边,我们本来不清楚谁是父亲谁是孩子,但这道题已经保证了u是v的父亲

2.讲解算法原理

1.建树 - vector数组

const int N = 110;
int n;
vector<int> edges[N]; //存树int main()
{cin >> n;for (int i = 1; i < n; ++i){int u, v; cin >> u >> v;//u -> vedges[u].push_back(v);}return 0;
}

2.求树的深度(高度):树高=max(子树的高度)+1

当我们站在根节点的角度求深度的时候,你只要告诉我左子树以及右子树这两颗子树的深度比较出来的最大值,再加1返回就行(树高=max(子树的高度)+1),如何求子树的高度?我们发现子树本身还是一个树,就可以继续套用这个公式(树高=max(子树的高度)+1),就可以用递归来实现求深度

int dfs(int u)
{int ret = 0;for (auto v : edges[u]){ret = max(ret, dfs(v));}return ret + 1;
}

3.树的宽度:借助bfs过程,每次入队出队一层、

树的宽度和一层一层有关系,如果涉及一层一层的话,用bfs比较好解,因为用bfs,每次循环就是把一层加入到队列里面

   

int bfs()
{queue<int> q;q.push(1);int ret = 0;while (q.size()){//记录比较队列元素个数int sz = q.size();ret = max(ret, sz);//把每层孩子加入队列之后循环结束while (sz--){int u = q.front(); q.pop();for (auto v : edges[u]){q.push(v);}}}return ret;	
}

4.求x到y到距离:1.先从x向上爬,同时标记路径中,所有的点到 x的距离 2.接下来从y开始向上爬,当第一次遇到标记点时,更新结果

                                  

假设我们要求10到7之间的距离,2*2+1=5,我们可以先让10这个点向上爬,并标记向上爬的所有路径,比如10爬到6,就标记6到10之间的距离是1,继续爬到3,标记3到10的距离等于2,爬到1,标记1到10的距离是3,爬到不能再爬的时候停止

当标记完10爬到1的路径之后,让7开始向上爬,7向上爬一个点的时候就发现标记点了,这个路径就是1,刚刚标记的过程中3到10的距离是2,所以2*2+1就是10到7的距离了

1.如何向上爬?

创建数组 int fa[N];  fa[i] 表示 i 这个点的父亲是谁,比如fa[6] = 3,6的父亲就是3

                                     

2.如何标记当前点到x的距离

创建数组int dsit[N]; //dist[i] 表示 i 这个点到x的最短距离,让x指向10,如果10有父亲,更新父亲到10的距离,dist[fa[x]] = dist[x] + 1; 更新完后,让x向上移动,x = fa[x];一直重复此过程,直到走到顶

                                            

3.如何标记y到相遇点的距离

创建变量 int len = 0;假设刚开始变量y指向7,如果7有父亲,并且当前点不是相遇点就让y往上爬,直到爬到相遇点为止,y = fa[y],len++;直到y走到相遇点为止或是走到不能在走走到1为止,此时len里面就存着y到相遇点的距离

代码实现:

#include <iostream>
#include <vector>
#include <queue>
using namespace std;const int N = 110;
int n;
vector<int> edges[N]; //存树int fa[N]; //fa[i]表示i结点的父亲
int dist[N]; //dist[i]表示i到x的最短距离int dfs(int u)
{int ret = 0;for (auto v : edges[u]){ret = max(ret, dfs(v));}return ret + 1;
}int bfs()
{queue<int> q;q.push(1);int ret = 0;while (q.size()){//记录比较队列元素个数int sz = q.size();ret = max(ret, sz);//把每层孩子加入队列之后循环结束while (sz--){int u = q.front(); q.pop();for (auto v : edges[u]){q.push(v);}}}return ret;	
}int main()
{cin >> n;for (int i = 1; i < n; ++i){int u, v; cin >> u >> v;//u -> vedges[u].push_back(v); //孩子v存到各自的父亲u里fa[v] = u; //v的父亲是u}//求深度cout << dfs(1) << endl;//求宽度cout << bfs() << endl;//求距离int x, y; cin >> x >> y;while (x != 1){dist[fa[x]] = dist[x] + 1;x = fa[x];}int len = 0;while (y != 1 && dist[y] == 0) //没经过x经过的点,dist的值为0{len++;y = fa[y];}cout << dist[y] * 2 + len;return 0;
}

相关文章:

洛谷P3884 [JLOI2009] 二叉树问题(详解)c++

题目链接&#xff1a;P3884 [JLOI2009] 二叉树问题 - 洛谷 | 计算机科学教育新生态 1.题目解析 1&#xff1a;从8走向6的最短路径&#xff0c;向根节点就是向上走&#xff0c;从8到1会经过三条边&#xff0c;向叶节点就是向下走&#xff0c;从1走到6需要经过两条边&#xff0c…...

《Foundation 起步》

《Foundation 起步》 引言 Foundation 是一个广泛使用的开源前端框架,由 ZURB 团队创建。它旨在帮助开发者构建响应式、可访问性和移动优先的网页。本文将为您提供一个全面的指南,帮助您从零开始学习并使用 Foundation。 Foundation 简介 什么是 Foundation? Foundatio…...

【hot100】刷题记录(6)-轮转数组

题目描述&#xff1a; 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转…...

Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊(毛玻璃)对比,Kotlin

Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊&#xff08;毛玻璃&#xff09;对比&#xff0c;Kotlin import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.RectF …...

ThinkPad E480安装Ubuntu 18.04无线网卡驱动

个人博客地址&#xff1a;ThinkPad E480安装Ubuntu 18.04无线网卡驱动 | 一张假钞的真实世界 遗憾的是虽然下面的方法可以解决&#xff0c;但是内核升级后需要重新安装。 基本信息 Ubuntu 18.04ThinkPad E480使用下面的命令查看 Linux 内核&#xff1a; $ uname -r 5.0.0-3…...

自然语言处理——从原理、经典模型到应用

1. 概述 自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是一门借助计算机技术研究人类语言的科学&#xff0c;是人工智能领域的一个分支&#xff0c;旨在让计算机理解、生成和处理人类语言。其核心任务是将非结构化的自然语言转换为机器可以…...

Ollama 运行从 ModelScope 下载的 GGUF 格式的模型

本文系统环境 Windows 10 Ollama 0.5.7 Ollama 是什么&#xff1f; Ollama 可以让你快速集成和部署本地 AI 模型。它支持各种不同的 AI 模型&#xff0c;并允许用户通过简单的 API 进行调用 Ollama 的安装 Ollama 官网 有其下载及安装方法&#xff0c;非常简便 但如果希…...

Haproxy介绍及学习

一、负载均衡(load balance)&#xff1a; 1.一种服务基于硬件设备实现的高可用反向代理技术&#xff0c;将特定的业务分担给指定的一个或者多个后端特定的服务器&#xff0c;提高了业务的并发处理能力保证业务的高可用并方便对业务后期的水平动态扩展性。 2.使用负载均衡的原因…...

【2024年华为OD机试】 (C卷,200分)- 贪心歌手(JavaScriptJava PythonC/C++)

一、问题描述 问题描述 一个歌手需要从A城前往B城参加演出&#xff0c;必须在T天内到达。途中会经过N座城市&#xff0c;且不能往回走。每两座城市之间的行程天数已知。歌手在每座城市都可以卖唱赚钱&#xff0c;但收入会随着停留天数的增加而递减。具体来说&#xff0c;第一…...

深度学习在金融风控中的应用:突破传统模型的瓶颈

深度学习在金融风控中的应用:突破传统模型的瓶颈 金融风险控制(简称“风控”)是现代金融体系中至关重要的一环,关系到金融机构的稳定性、客户的安全以及整体经济的健康运行。近年来,随着深度学习的迅猛发展,传统的风控模型正面临被颠覆的挑战,新的技术手段和思维方式正…...

LLM - 大模型 ScallingLaws 的指导模型设计与实验环境(PLM) 教程(4)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/145323420 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Scaling Laws (缩放法则) 是大模型领域中,用于描述 模型性能(Loss) 与…...

hunyuan 混元学习

使用了5个subset,也是用了text-image和text-video进行训练的 也是进行了复杂的视频选择。同movie gen. 也进行了模型切断&#xff0c;用拉普拉斯算子找到最清晰的一帧作为训练的起始 训练了不同的模型去选择数据&#xff0c;比如用Dover去选择美观度比较好的数据&#xff0c…...

开发、科研工具汇总

一些基础教程网站 W3&#xff1a;w3school 在线教程 菜鸟&#xff1a;菜鸟教程 - 学的不仅是技术&#xff0c;更是梦想&#xff01; 开发相关参考文档 Vue2&#xff1a;Vue.js Vue3&#xff1a;Vue.js - 渐进式 JavaScript 框架 | Vue.js MDN&#xff1a;MDN Web Docs HT…...

项目部署(springboot项目)

1、安装Nginx&#xff0c;并开启 2、前端项目打包&#xff1a;npm run build:prod--->dist 3、后端项目打包&#xff1a;install--->xxx.jar 4、开放需要的端口号&#xff1a;比如我的后端项目端口号为8282&#xff0c;则需要防火墙和服务器同时开发8282端口 5、将di…...

OpenEuler学习笔记(十四):在OpenEuler上搭建.NET运行环境

一、在OpenEuler上搭建.NET运行环境 基于包管理器安装 添加Microsoft软件源&#xff1a;运行命令sudo rpm -Uvh https://packages.microsoft.com/config/centos/8/packages-microsoft-prod.rpm&#xff0c;将Microsoft软件源添加到系统中&#xff0c;以便后续能够从该源安装.…...

神经网络的通俗介绍

人工神经网络&#xff0c;是一种模仿人类大脑工作原理的数学模型。人类的大脑是由无数的小“工作站”组成的&#xff0c;每个工作站叫做“神经元”。这些神经元通过“电线”互相连接&#xff0c;负责接收、处理和传递信息。 一、人类大脑神经网络 人类大脑的神经网络大概长这…...

基于 AWS SageMaker 对 DeepSeek-R1-Distilled-Llama-8B 模型的精调与实践

在当今人工智能蓬勃发展的时代&#xff0c;语言模型的性能优化和定制化成为研究与应用的关键方向。本文聚焦于 AWS SageMaker 平台上对 DeepSeek-R1-Distilled-Llama-8B 模型的精调实践&#xff0c;详细探讨这一过程中的技术细节、操作步骤以及实践价值。 一、实验背景与目标 …...

如何使用DeepSeek R1

以下是如何使用DeepSeek R1的详细步骤&#xff1a; ### 一、注册DeepSeek账户 1. **访问官方网站**&#xff1a; - 打开浏览器&#xff0c;访问[chat.deepseek.com](http://chat.deepseek.com)。 2. **注册账户**&#xff1a; - 使用电子邮件、Google账户或86手机号码…...

大屏 UI 设计风格的未来趋势

在科技飞速革新的时代&#xff0c;大屏设备的应用领域不断拓展&#xff0c;从城市的智能交通指挥中心&#xff0c;到商场的互动广告大屏&#xff0c;再到家庭的超大尺寸智能电视&#xff0c;大屏已然成为信息展示与交互的关键载体。大屏 UI 设计风格也随之不断演变&#xff0c;…...

unity学习22:Application类其他功能

目录 1 是否允许后台运行 1.1 Application.runInBackground&#xff0c;显示是否允许后台运行 1.2 设置的地方 2 打开URL 2.1 Application.OpenURL("") 打开超链接 3 退出游戏 3.1 Application.Quit() 退出游戏 4 场景相关 5 返回游戏状态 6 控制游戏的行…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...