【图论】求树的直径(最长链)

本文介绍了利用深度优先搜索(DFS)的双指针方法来求解树的直径问题,即找到树中最长的路径。通过从任意节点P开始,找到最远节点Q,然后再从Q出发找到最远节点W,W与Q之间的距离即为树的直径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法有很多,我这里用2种dfs的做法来做
方法:先从任意一点P出发,找离它最远的点Q,再从点Q出发,找离它最远的点W,W到Q的距离就是是的直径

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
#define ll long long
const int maxn=2e5+5;
int d[maxn],head[maxn],f_num,ans,tot;
struct E{
   
	
在解决树形动态规划问题时,邻接表是存储树结构的一种高效方法,特别适用于最长链问题。首先,我们需要理解邻接表的工作原理:它将每个节点映射到一个链表,链表中存储了该节点的所有子节点。这样的存储方式能够很好地表达树的层次关系,并且能够快速访问任何节点的子节点。 参考资源链接:[叶诗富教练详解树形动态规划: longest chain问题与应用](https://wenku.youkuaiyun.com/doc/223hhrmwek) 为了求解最长链问题,我们可以从叶子节点开始,向根节点方向递归地计算并存储每个节点的最大链长度。具体操作如下: 1. 初始化一个大小为N的数组`dp`,其中N为节点数量,用于存储每个节点的最大链长度。 2. 遍历每个节点,对于每个节点u: - 初始化`dp[u]`为1,因为每个节点自身可以构成一个长度为1的链。 - 遍历u的每一个子节点v: - 更新`dp[u]`为`max(dp[u], 1 + dp[v])`,因为u的最长链可以是u自身加上其任一子节点v的最大链长度。 3. 在所有节点的`dp`值中,找到最大的值,即为整个树的最长链长度。 在实际编码过程中,我们需要将树的输入数据转换为邻接表的形式。例如,给定一个树的节点数量N和M条边,可以使用一个大小为N的列表`adjList`来存储邻接表,每个列表项也是一个列表,存储对应节点的所有子节点索引。通过邻接表,我们可以方便地通过父节点索引访问其子节点,从而快速完成上述递归计算过程。 如果需要更深入的了解和更多的实例,可以参考《叶诗富教练详解树形动态规划: longest chain问题与应用》。这份资料详细讲解了如何利用邻接表处理树形动态规划问题,并提供了实际问题的解决方案,帮助读者更好地理解这一复杂问题的求解过程。 参考资源链接:[叶诗富教练详解树形动态规划: longest chain问题与应用](https://wenku.youkuaiyun.com/doc/223hhrmwek)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值