树的直径(最长路径)

这篇博客介绍了如何计算无向连通树的直径,即树中两个最远顶点之间的距离。通过深度优先遍历的方法,首先从任意节点出发找到最长路径的终点,然后从这个终点再次出发寻找最长路径,以此确定树的直径。此外,还探讨了树形动态规划(DP)的应用,并给出了例题。
摘要由CSDN通过智能技术生成

无向连通树即其直径定义

有一无向连通树,该树的直径就是树上最远两点的距离。
无向连通树: 从一个顶点出发能够到达任意一个顶点,且有n个顶点,n-1条边,没有环。

如何求直径

深度优先遍历

深度优先遍历。先从任意一个顶点 u 出发寻找以其为起点的最长路径,再从终点出发寻找以该终点 s 为起点的最长路径。以该终点为起点的最长路径即为树的直径。

证明:

  1. 如果u是树直径(最长路径) s -> t上的一点,那么以u为起点寻找最长路径,终点一定是s或t
  2. 如果u不是树直径(最长路径) s -> t上的一点,那么又分为两种情况
    a. 以点u搜到的最远点形成的路径与s->t有交点x,x是直径上的一点,又回到第一种情况。
    在这里插入图片描述
    b:以点u搜到的最远点为T的路径与s->t没有交点,又因为是连通的,那么可以从u走出一条路,该路与s->t有交点k。那么如图
    在这里插入图片描述

那么 dist(u,T) > dist(u,k) + dist(k,t)
–>dist(u,T) > dist(k,t)
–>dist(u,T) + dist(s,k)+dist(u,k) > dist(k,t) + dist(s,k) = dist(s,t)
那么最长路就变成了dist(u,T) + dist(s,k)+dist(u,k)。与假设矛盾。

树形DP

参考链接
参考链接

例题

牛客NC99 树的直径

使用深度优先遍历解决:

public class Solution {
   
    class Interval {
   
        int start;
        int end;
    }

    /**
     * 边
     *     在本题中,起点、终点、长度都相同就算同一条边
     *     甚至每两个点之间最多只会有一条边
     */
    class Edge {
   
        int start, end;
        int len;

        public Edge(int start, int end, int len){
   
            this.start = start;
            this.end = end;
            this.len = len;
        }

        public Edge(){
   }

        @Override
        public int hashCode(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值