树的直径(求法以及练习)

树的直径是指树上任意两点间的最大距离。求解方法包括两次BFS或DFS,以及树形DP。在含有负权重的树中,求直径不能使用BFS或DFS,而应采用DP。在实际问题中,如巡逻问题,需要两次计算直径并处理边的权重。此外,通过求树的直径,可以解决某些图论问题,如树网的核和最大化无向图中两点间必经边的个数。

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

何为树的直径,
简单来说其实就是在一棵树上, 距离最远的两个点的距离.
如何求直径

  1. b f s ( d f s ) bfs(dfs) bfs(dfs):第一次 b f s ( d f s ) bfs(dfs) bfs(dfs) :从任意节点出发, 求出到该节点最远的节点 p p p, 然后进行第二次 b f s ( d f s ) bfs(dfs) bfs(dfs), 求出到 p p p最远的节点 q q q, p p p q q q的路径长度即为树的直径.
  2. 树形 d p dp dp: 设 d p [ x ] dp[x] dp[x]表示从节点 x x x出发走向以 x x x为根的子树,能够到达的最远节点的距离, 设集合 y 1 , y 2 , y 3 , . . . . . . y t {y1, y2, y3,......yt} y1,y2,y3,......yt x x x的子节点, e d g e ( x , y ) edge(x,y) edge(x,y)为边的权值大小, 则状态转移方程为 d p [ x ] = max ⁡ 1 < = i < = t d p [ y i ] + e d g e ( x , y i ) dp[x]=\displaystyle\max_{1<=i<=t}{dp[y_i] + edge(x,y_i)} dp[x]=1<=i<=tmaxdp[yi]+edge(x,yi), 接下来我们考虑对于每个节点 x x x求出经过 x x x的最长链的长度 l e n [ x ] len[x] len[x], max ⁡ 1 < = i < = n l e n [ i ] \displaystyle\max_{1<=i<=n}len[i]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值