树的直径,树的中心,树的重心
树的直径:树上两点间最长距离所对应的路径
求法一:树形dp;
- 从每个点向下搜索,找到以该点为根到子节点的最大值和次大值
- 然后将次大值和最大值相加,即求得经过该点的最长路径
- 然后遍历所有点,找最长的最长路径
树形 DP 可以在存在负权边的情况下求解出树的直径
提出的疑惑
- 为什么是向下搜索最大值和次大值值得出直径长度
- 为什么要遍历所有点,而不是直接输出顶点的最大值和次大值之和
另一种求法:两次dfs
- 随便找一个点向下dfs,找到离该点最远的点
- 再以这个最远的点为根节点,向下找离根节点最远的点
- 这两个点的距离为直径,两点为直径的端点
若存在负权边,则无法使用两次 DFS 的方式求解直径。
证明过程
树的中心:以树的中心为整棵树的根时,从该跟到每个叶子节点的最长路径最短
求法:换根dp
- 第一步和树形dp一样找出每个点向下搜索的最大值和次大值
- 然后时以每个点向上搜索最大值,用父节点的信息更新子节点的信息
- 父节点的也分为向上的最长路径和向下的最长路径,只需取两者中最大的路径更新子节点的相似最长路径即可
- 但需要注意的是,父节点向下走的最大路径可能经过该子节点,这时,用父节点的次大值与父节点的向上最大值更新即可
- 否则就用最大值和向上最大值更新
- 最后遍历所有点的向下最大和向上最大,取该从某点出发的到某点的最长路径的最小值