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

2/3树的直径等内容 学习总结

树的直径值树中最长的简单路径,一般用两次dfs和树形dp求,是数据结构中常见常考的重点之一。

两次dfs求树的直径

求法

从任意点dfs一次,找到距离该点最远的点,记为点 \(s\)

\(s\) 出发再dfs一次,找到距离最远的点,记为点 \(t\)

\(s\)\(t\) 的简单路径一定是树的直径之一。

证明

1

如上图

根据定义,不存在 \(u\) 使得 \(|u\rightarrow s|>|t\rightarrow s|\)

如果存在节点 \(u\),使得 \(|u\rightarrow t|>|s\rightarrow t|\)

那么 \(|n\rightarrow u|>|n\rightarrow s|\),故 \(|1\rightarrow u|>|1\rightarrow s|\)

第一次搜索就会搜到 \(u\) 而不是 \(s\)

故假设矛盾,所以不存在任何一点,到 \(s\) 或者 到 \(t\) 的距离,比 \(|s\rightarrow t|\) 更远 。

证毕

注意事项

1.必须全是非负权边

\(\mathscr{A\rightarrow^{10}B\rightarrow^{-1000}C\rightarrow^{1000}D}\)

如果搜索的起点选择了 \(\mathscr{D}\),可以求出直径。但是如果选择了 \(\mathscr{B}\),则求不出直径。

代码

1.有多个dfs/bfs时,函数名不能是其他函数名的前缀,变量名同理。

$\surd$

void dfs1(...)

void dfs2(...)

$\times$(打错了就很难调)

void dfs(...)

void dfs2(...)

AC code
#include<bits/stdc++.h>
using namespace std;
int d1[100005],d2[100005];
vector<int> g[100005];
void dfs1(int x,int fa){for(auto y:g[x]){if(y==fa) continue;d1[y]=d1[x]+1;dfs1(y,x);}
}
void dfs2(int x,int fa){for(auto y:g[x]){if(y==fa) continue;d2[y]=d2[x]+1;dfs2(y,x);}
}
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);int n;cin>>n;for(int i=1;i<n;i++){int x,y;cin>>x>>y;g[x].push_back(y);g[y].push_back(x);}dfs1(1,0);int maxn=0,s=0;for(int i=1;i<=n;i++){if(d1[i]>=maxn){s=i;maxn=d1[i];}}dfs2(s,0);int maxm=0,t=0;for(int i=1;i<=n;i++){if(d2[i]>=maxm){t=i;maxm=d2[i];}}cout<<d2[t];return 0;
}

树形dp求树的直径

求法

记录 \(d1[u]\) 为以 \(u\) 为根的子树中,从 \(u\) 出发向下的最长路径。

\(d2[u]\) 为以 \(u\) 为根的子树中,从 \(u\) 出发向下的次长路径。(\(\Large{不与最长路径重合!}\))

遍历时 \(u\) 的儿子 \(v\) 会贡献长度 \(len=d1[v]+w(u,v)\) 的路径,此时:

如果 \(len>d1[u]\),说明找到了更长的路径,\(d2[u]=d1[u]\)\(d1[u]=len\)

否则如果 \(len>d2[u]\),说明比次长的长,比最长的短,只需更新次长的。\(d2[u]=len\)

http://www.jsqmd.com/news/338577/

相关文章:

  • 2/3学习总结
  • Nat Hum Behav:记忆系统“殊途同归”?情景记忆与语义记忆在大脑中竟共用一套系统!
  • 澳洲奶粉品牌排名十强:澳洲A2奶源,好消化吸收,提升宝宝免疫力的奶粉! - 深度智识库
  • VS Code工作空间忽略部分文件和文件夹
  • DeepSeek论文发表16天后,国内团队已经写出了模型的「生物字典」
  • nyx
  • 阿里发布了他们最强思考模型,有点东西。。(附实测)
  • 关于招商消费分期场景额度怎么使用以及如何提出来变现 - 金诚数码回收
  • 腾讯拟12-18个月内扩大中东数据中心规模
  • 彼得林奇如何看待公司的跨界合作策略
  • 学术--读书笔记更新 《复杂》(Complexity: A Guided Tour):智能涌现的幽灵——是“自指”吗?
  • C++中的观察者模式实战
  • 字节跳动的800V还在招标,美团就要先用上SST直流供电了
  • 《探索AI应用架构师为智能虚拟人设计系统带来的创新点》
  • C++代码风格检查工具
  • 企业代理记账系统首页界面设计优化
  • 为没有Linus的一天做准备!Linux社区敲定接班预案:若维护者不愿干就立刻定替代人选,这事绝不能拖
  • 深入理解LuatOS中的Modbus RTU通信实现原理
  • CVE-2021-44228_ ApacheLog4j2远程代码执行漏洞
  • 高性能TCP服务器设计
  • <span class=“js_title_inner“>4000万行的Linux怎么管?Linus爆料:两周合并1.2万次提交、7周专门抓Bug,“我不是世界之王,只能给内核定规矩”</span>
  • 2026年最新成都公墓代理商五大推荐:成都陵园、墓地、丧葬一条龙服务,省心选墓权威指南 - 深度智识库
  • 2026年重庆防火门窗行业优质服务商推荐:钢制防火门窗、钢质防火门窗、甲级防火门窗、钢质防火门、木质防火门、钢木质防火门选择指南 - 海棠依旧大
  • 基于机器学习的就业岗位推荐系统(源码+lw+部署文档+讲解等)
  • 【读书笔记】 《复杂》(Complexity: A Guided Tour):智能涌现的幽灵——是“自指”吗?
  • 基于人脸识别的智慧医疗预约挂号平台系统(源码+lw+部署文档+讲解等)
  • Microsoft Agent Framework在微信公众号AI辅助撰文中的应用
  • 2026包装盒设计优质服务商推荐榜 - 优质品牌商家
  • .NET开发-PDF处理不重复造轮子!PDFPatcher省去80%代码,聚焦核心业务
  • 揭秘!大数据数据标注背后的神秘力量