P3884 [JLOI2009] 二叉树问题

news2025/1/14 16:38:26

题目描述:

如下图所示的一棵二叉树的深度、宽度及结点间距离分别为:

- 深度:4
- 宽度:4
- 结点 8 和 6 之间的距离:8
- 结点 7 和 6 之间的距离:3

其中宽度表示二叉树上同一层最多的结点个数,节点 u, v 之间的距离表示从 u 到 v 的最短有向路径上向根节点的边数的两倍加上向叶节点的边数。

给定一颗以 1 号结点为根的二叉树,请求出其深度、宽度和两个指定节点 x, y 之间的距离。

## 输入格式

第一行是一个整数,表示树的结点个数 n。  
接下来 n - 1 行,每行两个整数 u, v,表示树上存在一条连接 u, v 的边。  
最后一行有两个整数 x, y,表示求 x, y 之间的距离。

## 输出格式

输出三行,每行一个整数,依次表示二叉树的深度、宽度和 x, y 之间的距离。

## 样例 #1

## 样例输入 #1
10                                
1 2                            
1 3                            
2 4
2 5
3 6
3 7
5 8
5 9
6 10
8 6

## 样例输出 #1
4
4
8

## 提示

对于全部的测试点,保证 1 ≤ u , v , x , y ≤ n ≤ 100,且给出的是一棵树。保证 u 是 v 的父结点。

解题思路:

首先我们阅读题目,一是求树的深度,一个是求树的宽度,以及两个结点的距离(特殊)。我们一个一个来分析,求树的深度可以用到dfs的思想。观察输入的数据,首先是结点个数n,接下来的n-1行输入;第一位表示根结点,第二位表示该根结点的子结点。最后一行输入需要求得两个结点的距离。

根据结点的输入方式我们采用vector的二维数组来储存结点,例edges[1]数组 存储结点1的子结点。

接着我们使用dfs进行搜索,从根结点开始,通过for循环遍历单个根结点的子结点,通过递归的方式进行深度搜索,直到遇到底部就进行返回。题目要求我们求出最大的深度,所以我们可以使用一个max来对数据进行实时更新取得最大值。最后返回到根结点,再加上根结点本身就是最大深度。

总结的出树的最大深度 = max(左子树最大深度,右子树最大深度)+   1

模块代码: 

int dfs1(int root)
{
	int ret = 0;
	for (auto e : edges[root])
	{
		ret = max(ret, dfs1(e));
	}
	return ret + 1;
}

下面我们要求最大的宽度,我们用一个队列来进行操作。首先对根结点进行入队,然后将该根结点的子结点全部入队,然后根结点出队。算一下现在队列的大小,紧接着将队列所有根结点的子结点入队,将所有根结点出队,算一算队列的大小。

最后通过一个max来更新数据,这样我们就能找到最大的宽度。

模块代码:

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 num = q.front();
			q.pop();
			for (auto e : edges[num])//让子结点入队列
			{
				q.push(e);
			}
		}
	}
	return ret;
}

最后是距离问题,阅读题目,结点u向上一条边的距离是2,而向下一条边的距离是1。例如从10到7的距离是5(2*2+1),但是从7到10的距离就是4(2+1*2)。

由于计算机不像我们人一样能分辨在哪个结点进行分叉能得到最短路径,所以我们统一以根节点(1)为终止位置。首先我们用一个数组 fa 储存每一个结点的父结点(因为我们先前的数组只允许从上往下寻找数),再开一个数组 dist 存储每个结点之间的距离。以u结点为起始点,它到它父结点的距离就等于该点的距离加上1,再将该结点u设置为其父结点,一直遍历到根结点(1)停止。接下来我们找到v,创建一个len变量记录边数,只要v不等于根结点或者 dist[v] 内的数据为0,就让v等于它的父结点。当dist[v] 内不为0时,说明走到了分叉口,就停止循环。

最后我们将 dist[v] * 2  +  len  输出就是最终答案。

最后放上完整代码:

样例代码:

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

const int N = 110;
vector<int> edges[N];
int dist[N], fa[N];

int dfs1(int root)
{
	int ret = 0;
	for (auto e : edges[root])
	{
		ret = max(ret, dfs1(e));
	}
	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 num = q.front();
			q.pop();
			for (auto e : edges[num])//让子结点入队列
			{
				q.push(e);
			}
		}
	}
	return ret;
}

int main()
{
	int n;
	cin >> n;
	for (int i = 1; i < n; i++)
	{
		int a, b;
		cin >> a >> b;
		edges[a].push_back(b);
		fa[b] = a;
	}
	int get1 = dfs1(1);
	cout << get1 << endl;
	int get2 = bfs();
	cout << get2 << endl;

	int u, v;//结点
	cin >> u >> v;

	while (u != 1)//算结点到1的距离
	{
		dist[fa[u]] = dist[u] + 1;
		u = fa[u];
	}
	int len = 0;
	while (v != 1 && dist[v] == 0)
	{
		len++;
		v = fa[v];
	}
	cout << len + dist[v] * 2 << endl;
	return 0;
}

 总结:

这一题考察到了dfs和bfs的使用,是一道综合性比较强的题,值得一刷。

创作不易,希望大家多多支持!!!

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

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

相关文章

ssm旅游攻略网站设计+jsp

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 需要源码或者定制看文章最下面或看我的主页 目 录 目 录 III 1 绪论 1 1.1 研究背景 1 1.2 目的和意义 1 1.3 论文结构安排 2 2 相关技术 3 2.1 SSM框架介绍 3 2.2 B/S结构介绍 3 …

Qt类的提升(Python)

from PyQt5.QtWidgets import QPushButtonclass apushbutton(QPushButton):def __init__(self, parentNone):super().__init__(parent)self.setText("Custom Button")self.setStyleSheet("background-color: yellow;")上述为一个“模板类”&#xff0c;命名…

kubernetes上安装kubesphere

准备工作 需要配置三台虚拟机 关闭防火墙 systemctl stop firewalldsystemctl disable firewalld 临时关闭selinux setenforce 0 永久关闭selinux vi /etc/selinux/config 安装docker rpm -qa|grep docker yum remove docker* -y rpm -qa|grep docker yum install -y yum-u…

Windows图形界面(GUI)-QT-C/C++ - QT控件创建管理初始化

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 控件创建 包含对应控件类型头文件 实例化控件类对象 控件设置 设置父控件 设置窗口标题 设置控件大小 设置控件坐标 设置文本颜色和背景颜色 控件排版 垂直布局 QVBoxLayout …

分页工具代码重构

文章目录 1.common-mybatis-plus-starter1.目录2.PageInfo.java3.PageResult.java4.SunPageHelper.java 1.common-mybatis-plus-starter 1.目录 2.PageInfo.java package com.sunxiansheng.mybatis.plus.page;import lombok.EqualsAndHashCode; import lombok.ToString;impor…

Vue学习二——创建登录页面

前言 以一个登录页面为例子&#xff0c;这篇文章简单介绍了vue&#xff0c;element-plus的一些组件使用&#xff0c;vue-router页面跳转&#xff0c;pinia及持久化存储&#xff0c;axios发送请求的使用。后面的页面都大差不差&#xff0c;也都这么实现&#xff0c;只是内容&am…

初始Django框架

初识Django Python知识点&#xff1a;函数、面向对象。前端开发&#xff1a;HTML、CSS、JavaScript、jQuery、BootStrap。MySQL数据库。Python的Web框架&#xff1a; Flask&#xff0c;自身短小精悍 第三方组件。Django&#xff0c;内部已集成了很多组件 第三方组件。【主要…

深度学习每周学习总结R4(LSTM-实现糖尿病探索与预测)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客R6中的内容&#xff0c;为了便于自己整理总结起名为R4&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结1. LSTM介绍LSTM的基本组成部分如何理解与应用LSTM 2. 数据预处理3. 数…

虚假星标:GitHub上的“刷星”乱象与应对之道

在开源软件的世界里&#xff0c;GitHub无疑是最重要的平台之一。它不仅是一个代码托管平台&#xff0c;也是一个社交网络&#xff0c;允许开发者通过“点赞”&#xff08;即加星&#xff09;来表达对某个项目的喜爱和支持&#xff0c;“星标”&#xff08;Star&#xff09;则成…

前端笔记----

在我的理解里边一切做页面的代码都是属于前端代码。 之前用过qt框架&#xff0c;也是用来写界面的&#xff0c;但是那是用来写客户端的&#xff0c;而html是用来写web浏览器的&#xff0c;相较之下htmlcssJavaScript写出来的界面是更加漂亮的。这里就记录我自个学习后的一些笔…

【面试题】技术场景 4、负责项目时遇到的棘手问题及解决方法

工作经验一年以上程序员必问问题 面试题概述 问题为在负责项目时遇到的棘手问题及解决方法&#xff0c;主要考察开发经验与技术水平&#xff0c;回答不佳会影响面试印象。提供四个回答方向&#xff0c;准备其中一个方向即可。 1、设计模式应用方向 以登录为例&#xff0c;未…

2025华数杯国际赛A题完整论文讲解(含每一问python代码+数据+可视化图)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2025“华数杯”国际大学生数学建模竞赛A题Can He Swim Faster的完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文…

关闭window10或11自动更新和自带杀毒

关闭window10或11自动更新和自带杀毒 1.关闭系统更新**修改组策略关闭自动更新****修改服务管理器关闭自动更新** 2.关闭系统杀毒 为什么需要关闭更新和杀毒 案例&#xff1a; #装完驱动隔一段时间就掉 #一些设置隔一段时间就重置了 #防止更新系统后有时卡 1.关闭系统更新 我…

解析OVN架构及其在OpenStack中的集成

引言 随着云计算技术的发展&#xff0c;虚拟化网络成为云平台不可或缺的一部分。为了更好地管理和控制虚拟网络&#xff0c;Open Virtual Network (OVN) 应运而生。作为Open vSwitch (OVS) 的扩展&#xff0c;OVN 提供了对虚拟网络抽象的支持&#xff0c;使得大规模部署和管理…

【ArcGIS技巧】如何给CAD里的面注记导入GIS属性表中

前面分享了GIS怎么给田块加密高程点&#xff0c;但是没有分享每块田的高程对应的是哪块田&#xff0c;今天结合土地整理软件GLAND做一期田块的属性怎么放入GIS属性表当中。 1、GLAND数据 杭州阵列软件&#xff08;GLand&#xff09;是比较专业的土地整理软件&#xff0c;下载之…

Excel中SUM求和为0?难道是Excel有Bug!

大家好&#xff0c;我是小鱼。 在日常工作中有时会遇到这样的情况&#xff0c;对Excel表格数据进行求和时&#xff0c;结果竟然是0&#xff0c;很多小伙伴甚至都怀疑是不是Excel有Bug&#xff01;其实&#xff0c;在WPS的Excel表格中数据求和&#xff0c;结果为0无法正确求和的…

Spring MVC简单数据绑定

【图书介绍】《SpringSpring MVCMyBatis从零开始学&#xff08;视频教学版&#xff09;&#xff08;第3版&#xff09;》_springspringmvcmybatis从零开始 代码、课件、教学视频与相关软件包下载-CSDN博客 《SpringSpring MVCMyBatis从零开始学(视频教学版)&#xff08;第3版&…

蓝桥杯备考:数据结构之栈 和 stack

目录 栈的概念以及栈的实现 STL 的stack 栈和stack的算法题 栈的模板题 栈的算法题之有效的括号 验证栈序列 后缀表达式 括号匹配 栈的概念以及栈的实现 栈是一种只允许在一端进行插入和删除的线性表 空栈&#xff1a;没有任何元素 入栈&#xff1a;插入元素消息 出…

使用Dify创建个问卷调查的工作流

为啥要使用Dify创建工作流呢&#xff1f;一个基于流程的智能体的实现&#xff0c;特别是基于业务的实现&#xff0c;使用Dify去实现时&#xff0c;通常都是一个对话工作流&#xff0c;当设计到相对复杂一些的流程时&#xff0c;如果将所有逻辑都放在对话工作流中去实现&#xf…

QT Quick QML 实例之椭圆投影,旋转

文章目录 一、前言二、演示三、部分代码与分析 QML 其它文章请点击这里: QT QUICK QML 学习笔记 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 一、前言 此 Demo 主要用于无人机吊舱视角的模拟&#xf…