洛谷——P3884 [JLOI2009] 二叉树问题(最近公共祖先,LCA)c++

文章目录

  • 一、题目
  • [JLOI2009] 二叉树问题
    • 题目描述
    • 输入格式
    • 输出格式
    • 样例 #1
      • 样例输入 #1
      • 样例输出 #1
    • 提示
      • 基本思路:


一、题目

[JLOI2009] 二叉树问题

题目描述

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

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

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

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

输入格式

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

输出格式

输出三行,每行一个整数,依次表示二叉树的深度、宽度和 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 1 \leq u, v, x, y \leq n \leq 100 1u,v,x,yn100,且给出的是一棵树。

基本思路:

  • (1) 求出二叉树的深度,只需要dfs一遍求得每个节点的深度,然后取最大值即为二叉树的深度
  • (2)求二叉树宽度,某个深度节点数最多的即为宽度
  • (3) 求两点间的距离(最短有向路径上向根节点的边数的两倍加上向叶节点的边数),因为时有方向的,可以求出两点的LCA(最近公共祖先),然后答案所求距离就是向根节点到LCA的距离的2倍加上向叶节点到LCA的距离。
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl "\n"
#define int long long
#define fi first
#define se second
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define gcd __gcd
#define repn(i,a,n) for(int i = a; i <= n; i++)
#define rep(i,a,n) for(int i = a; i < n; i++)
typedef pair<int,int> PII; 
const int N = 110;
vector<int> edge[N];
int n,dist[N],fa[N];//分别记录dist:节点深度、以及fa:每个节点的父亲是谁 
int pre[N],x,y,bx,by;  //pre记录i从哪里来的
int depth,width,ans;// 依次表示二叉树的深度、宽度和 x,y 之间的距离

inline void dfs(int x){
	for(auto y:edge[x]){
		if(pre[x]!=y){
			pre[y]=x;//需要记录一下y来自那个节点,不然会死循环
			dist[y]=dist[x]+1;//y的深度等于x的深度加1
			fa[y]=x;//y的父亲节点是x
			dfs(y);
		}
	}

}

void solve(){
	cin>>n;
	rep(i,1,n){
		int u,v;
		cin>>u>>v;
		edge[u].pb(v);
		edge[v].pb(u);
	}  
	cin>>x>>y;
	bx=x,by=y;
	pre[1]=-1;
	dist[1]=1;//根节点的深度为1 
	dfs(1);//求出每个节点的深度 
	/*
	//每个节点的深度 
	for(int i=1;i<=n;i++)
	  cout<<i<<": "<<dist[i]<<endl;
	cout<<endl;
	//每个节点的父亲节点是谁 
	for(int i=1;i<=n;i++)
	  cout<<i<<": "<<dist[i]<<endl;
	*/
	//求出深度,即dist最大值 
	repn(i,1,n)
	  depth=max(depth,dist[i]);
	//求出宽度,即某深度节点数最多 
	repn(i,1,depth){
		int sum=0;
		repn(j,1,n)
		  if(dist[j]==i) sum++;
		width=max(width,sum);
	} 
	cout<<depth<<endl<<width<<endl;
	
	// 求x,y 之间的距离
	//首先找到x、y的最近公共祖先
	int step;
	if(dist[x]>dist[y]){
	 	step=dist[x]-dist[y];//深度较大的跳多少步可以达到同一深度
		repn(i,1,step)
	 		x=fa[x]; 
	}else{
		step=dist[y]-dist[x];//深度较大的跳多少步可以达到同一深度
		repn(i,1,step)
	 		y=fa[y]; 
	}    
	while(x!=y){//当x==y时,找到了x,y的最近公共祖先 
		x=fa[x],y=fa[y]; 
	} 
	//此时x、y均为起始的bx、by的LCA
	ans=(dist[bx]-dist[x])*2+(dist[by]-dist[y]);
	cout<<ans<<endl;
}

signed main(){
	IOS;
	int T=1;
	//cin>>T;
	while(T--){
		solve();
	}
	return 0;
}

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

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

相关文章

【AI提示词故事】《启示之星:寻找神殿的探险之旅》

故事叙述 在未来的某一天&#xff0c;人类发现了一个神秘的星球&#xff0c;被称为“启示之星”。传说在这颗星球上&#xff0c;有一座可以实现人类最大愿望的神殿。 启示之星 一支探险队被派往这颗星球&#xff0c;他们的目标是寻找神殿并实现自己的最大愿望。 在星球上&…

关于 curl 常用命令的使用整理【不定期更新】

目录 1. HTTP 请求2. 文件操作2.1 文件下载2.2 文件上传2.3 FTP 操作 3. 代理和网络设置4. 身份验证5. 调试和信息显示6. more and more curl 是一个用于在命令行下进行数据传输的工具&#xff0c;支持多种协议&#xff0c;包括 HTTP、HTTPS、FTP、FTPS、SCP、SFTP 等。它通常用…

结合ChatGPT和MINDSHOW自动生成PPT

总结/朱季谦 一、首先&#xff0c;通过chatGPT说明你的需求&#xff0c;学会提问是Ai时代最关键的一步。你需要提供一些关键信息&#xff0c;如果没有关键信息&#xff0c;就按照大纲方式让它设计&#xff0c;例如&#xff0c;我让它帮我写一份《2023年年中述职报告》的模版—…

项目管理进阶之序言

背景 可能任何一个程序猿/媛都有一个梦想&#xff0c;立志成为一个技术Leader&#xff0c;带领一个Team&#xff0c;完成一个组织中重要的Project。 有些人天赋异禀&#xff0c;光彩夺目&#xff0c;从小已形成的某些特质&#xff0c;足以让他/她胜任这个领域&#xff0c;我们…

第11章 GUI Page428 步骤七 设置圆,矩形,文字的前景色

运行效果&#xff1a; 关键代码&#xff1a; 分别设置圆&#xff0c;矩形&#xff0c;和文字的画笔颜色&#xff0c;其中文字的设置方法稍有不同 圆&#xff1a; 矩形&#xff1a; 文字&#xff1a;

CV算法面试题学习

本文记录了CV算法题的学习。 CV算法面试题学习 1 点在多边形内&#xff08;point in polygon&#xff09;2 高斯滤波器3 ViTPatch EmbeddingPosition EmbeddingTransformer Encoder完整的ViT模型 4 SE模块5 Dense Block6 Batch Normalization 1 点在多边形内&#xff08;point …

2000-2021年全国各省三农指标数据(700+指标)

2000-2021年全国各省三农指标数据合集&#xff08;700指标&#xff09; 1、时间&#xff1a;2000-2021年 2、来源&#xff1a;整理自2001-2022年农村年鉴 3、范围&#xff1a;31省市 4、指标&#xff1a;、农村经济在国民经济中的地位、社会消费品零售额_亿元、社会消费品零…

持续集成交付CICD:Jira 发布流水线

目录 一、实验 1.环境 2.GitLab 查看项目 3.Jira 远程触发 Jenkins 实现合并 GitLab 分支 4.K8S master节点操作 5.Jira 发布流水线 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构版本IP备注master1K8S master节点1.20.6192.168.204.180 jenkins…

Linux环境变量剖析

一、什么是环境变量 概念&#xff1a;环境变量&#xff08;environment variables&#xff09;一般是指在操作系统中用来指定操作系统运行环境的一些参数&#xff0c;是在操作系统中一个具有特定名字的对象&#xff0c;它包含了一个或多个应用程序所将使用到的信息&#xff0c…

Open3D 点云数据处理基础(Python版)

Open3D 点云数据处理基础&#xff08;Python版&#xff09; 文章目录 1 概述 2 安装 2.1 PyCharm 与 Python 安装 2.3 Anaconda 安装 2.4 Open3D 0.13.0 安装 2.5 新建一个 Python 项目 3 点云读写 4 点云可视化 2.1 可视化单个点云 2.2 同一窗口可视化多个点云 2.3…

蓝桥村的神秘农田

蓝桥村的神秘农田 问题描述 小蓝是蓝桥村的村长&#xff0c;他拥有一块神秘的农田。这块农田的奇特之处在于&#xff0c;每年可以种植两种作物&#xff0c;分别称为 "瑶瑶豆" 和 "坤坤果"。小蓝需要为每种作物选择一个整数的生长指数&#xff0c;瑶瑶豆的…

HEA---code

import matplotlib.pyplot as pltimport numpy as npfrom matplotlib.animation import FuncAnimationfrom matplotlib.offsetbox import OffsetImage, AnnotationBbox# 创建一个画布和坐标轴对象 fig, ax plt.subplots() # 创建一个参数t&#xff0c;范围是0到2π t np.lins…

关于“Python”的核心知识点整理大全39

目录 ​编辑 14.1.5 将 Play 按钮切换到非活动状态 game_functions.py 14.1.6 隐藏光标 game_functions.py game_functions.py 14.2 提高等级 14.2.1 修改速度设置 settings.py settings.py settings.py game_functions.py 14.2.2 重置速度 game_functions.py 1…

TCGA超过1G的病理wsi数据下载-gdc-client

使用网页端下载TCGA超过1G的病理wsi数据&#xff0c;数据下载到1G后就不能完整下载。遂采用gdc-client下载。 Win 环境下新建这个文件夹放在系统盘进行储存&#xff0c;否则会报错&#xff1a;ERROR: Unable to write state file: [WinError 17] 系统无法将文件移到不同的磁盘…

Node 源项目定制化、打包并使用全过程讲解

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是全栈工…

WGCLOUD快速部署方案 - 批量给Linux安装agent

有时候我们的Linux服务器比较多&#xff0c;一个一个安装比较花费时间&#xff0c;还要WGCLOUD提供了一个辅助工具wgcloud-bach-agent&#xff0c;可以批量给Linux服务器上传agent安装包&#xff0c;并自动解压和启动agent&#xff0c;可以大大减少我们的部署工作和时间 下载和…

无约束优化问题求解(4):牛顿法后续

目录 前言SR1, DFP, BFGS之间的关系 BB方法Reference 前言 Emm&#xff0c;由于上一篇笔记的字数超过了要求&#xff08;这还是第一次- -&#xff09;&#xff0c;就把后续内容放到这篇笔记里面了&#xff0c;公式的标号仍然不变&#xff0c;上一篇笔记的连接在这&#xff1a;…

C++之多层 if-else-if 结构优化(三)

C之多层 if-else-if 结构优化(二)-CSDN博客 接上面的内容继续讲解多层 if-else-if结构优化 8、利用规则执行器来进行优化 8.1 业务场景介绍 if (未注册用户){return false; }if (是否国外用户) {return false; }if (刷单用户) {return false; }if (未付费用户 && 不…

中国肺癌情形

写在前面 再看下中国肺癌的情形 综述 文章名期刊影响因子Non-small cell lung cancer in ChinaCancer Commun16.2 摘要 风险因子&#xff1a;吸烟史、家族史、放射暴露、空气污染、慢性肺病 晚期PD-1/PD-L1抑制剂单药使用或联合化疗药物作为标准治疗。局部肺癌晚期&#xf…

铁山靠之——HarmonyOS基础 - 1.0

HarmonyOS学习第一章 一、HarmonyOS简介1.1 安装和使用DevEco Studio1.2 环境配置1.3 项目创建1.4 运行程序1.5 基本工程目录1.5.1 工程级目录1.5.2 模块级目录1.5.3 app.json51.5.4 module.json51.5.5 main_pages.json 二、TypeScript快速入门2.1 简介2.2 基础类型2.2.1 布尔值…