2022年9月月赛乙组 T2.树的直径

简介: 2022年9月月赛乙组 T2.树的直径

2022年9月月赛乙组 T2.树的直径

内存限制: 256 Mb时间限制: 1000 ms

题目描述

给定一棵拥有 n 个结点的树,1 号点为根,请找出这棵树的直径。所谓直径就是树上最远的两点的距离。

输入格式

第一行:单个整数表示 n;

第二行:n−1 个整数表示 p2  到 pn ,pi  表示 i 号点父亲的编号,保证有 1≤pi<i。

输出格式

单个整数:表示树的直径。

数据范围

对于 30% 的数据, n≤20;

对于 60% 的数据, n≤5000;

对于 100% 的数据, 1≤n≤200,000。

样例数据

输入:

4

1 1 1

输出:

2

输入:

4

1 2 3

输出:

3

题目解析:

模板题,求树的直径是一个很经典的问题。

暴力求解方案:用bfs 或者 dfs 求出所有点和v点的距离,O(n)次搜索,就能够找到所有两点之间的距离。n是2*10^5,n*n的时间复杂度会超时。

因此,我们需要使用一些数学的结论:

任选一点v,找到离v点最远的一个点u,再找到离u最远的点w,则u--w是一条直径。

有了这个结论后,做两次搜索即可解决本题。

但要注意:如果所有的点形成一条线悬挂下来,则对于深度优先搜索,容易产生栈溢出。

所以,最好使用广度优先搜索(全局变量队列)。

1. #include <bits/stdc++.h>
2. using namespace std;
3. const int N=2e5+10;
4. vector<int> e[N];//e[i]里存储的是和i相邻的节点
5. int last,dis;//用来记录那个点距离s最远 最远的距离为多少
6. typedef pair<int,int>pii;//字典结构体 
7. bool vis[N];//标记该点是否被访问过
8. queue<pii> q;//队列
9. void bfs(int s){
10.   memset(vis,0,sizeof(vis));//初始化vis
11.   vis[0]=1;
12.   q.push(pii{s,0});//s为出发点 入队
13.   while(!q.empty()){
14.     pii pr=q.front();//保存对头
15.     q.pop();//出队
16.     last=pr.first;//更新最远节点
17.     dis=pr.second;//更新最大距离
18.     for(auto x:e[pr.first]){//查找下一个节点
19.       if(vis[x]) continue; //是否已经过
20.       q.push(pii{x,pr.second+1});//入队新节点
21.       vis[x]=1;//更新标记
22.     }
23.   } 
24. }
25. int main()
26. { 
27.   int n,f;
28.   cin>>n;
29.   for(int i=2;i<=n;i++){
30.     cin>>f;
31.     e[f].push_back(i);
32.     e[i].push_back(f);
33.   }
34.   bfs(1);//广搜根节点 找到离根节点最远的点last
35.   bfs(last);//广搜last 计算离last最远距离dis
36.   cout<<dis;
37.   return 0;
38. }


相关文章
|
机器学习/深度学习 Web App开发 测试技术
『软件测试3』八大典型的黑盒测试方法已来袭,快快接住!
该文章介绍了八种常用的黑盒测试方法,包括等价类划分、边界值分析、错误推测法、因果图法、决策表测试、状态转换法、场景法以及随机测试,并提供了相应的案例说明。
|
传感器 机器学习/深度学习 安全
智能家电
智能家电
360 1
|
运维 Kubernetes API
Kubernetes 入门&进阶实战
Kubernetes 入门&进阶实战
Kubernetes 入门&进阶实战
|
算法 IDE 开发工具
2021电赛F题之openmv数字识别--更新(附带视频与代码)
2021电赛F题之openmv数字识别--更新(附带视频与代码)
483 0
2021电赛F题之openmv数字识别--更新(附带视频与代码)
|
存储 人工智能
西门子S7-200 SMART Modbus RTU通信,如何编写从站程序
上篇文章中我们通过一个例子学习了西门子S7-200 SMART中断程序的编写,本篇我们开始学习S7-200 SMART的Modbus RTU通信。通过集成RS485端口或可选通信板SM CM01的RS485/RS232端口,S7-200 SMART可以作为Modbus RTU主站或者从站同多个设备进行通信。
西门子S7-200 SMART Modbus RTU通信,如何编写从站程序
|
Web App开发 监控 前端开发
Sentry Web 性能监控 - Web Vitals
Sentry Web 性能监控 - Web Vitals
518 0
Sentry Web 性能监控 - Web Vitals
|
XML Java 数据格式
Spring-基于Java类的配置
Spring-基于Java类的配置
171 0
|
JavaScript API 开发者
Vue3核心之响应式
Vue3核心之响应式
407 0
|
Java
营销活动送红包之更改现金活动状态(alipay.marketing.campaign.cash.status.modify)-java版
说明: 本帖是测试营销活动送红包的更改现金活动状态接口,本帖是使用沙箱环境测试的,仅供参考!! 是否需要签约:需要,【如何签约】  是否支持沙箱环境:支持 接口文档:查看  sdk下载:下载  营销活动送红包沙箱Java版demo:download:营销活动送红包Java版.
580 12