题目描述 给出一棵树,求树的直径及其数量(最长简单路径的长度和数量)。 输入格式 第一行一个整数 n , 0≤n≤10^5, 接下来有 n−1 行,每行 a,b 代表 a 到第 b 有一条长度为 1 的边。 1≤a,b≤n 该题思路
时间: 2024-02-26 19:54:35 浏览: 51
tsp.rar_visual c_剪枝树 c++_直径_算法试题
这是一道经典的树的直径问题,可以使用两次 DFS 或 BFS 来解决。
第一次 DFS/BFS 选取任意一个节点 $u$,从该节点出发找到距离它最远的节点 $v$,即树的一个端点。然后从节点 $v$ 出发继续 DFS/BFS 找到距离它最远的节点 $w$,此时 $v$ 到 $w$ 的距离就是树的直径。
第二次 DFS/BFS 统计直径的数量。具体地,我们从节点 $v$ 开始 DFS/BFS,对于每个节点 $u$ 记录从 $u$ 出发到 $v$ 的距离 $d_u$,并且维护一个计数器 $cnt$,表示有多少个节点到达了直径的终点 $w$。在 DFS/BFS 的过程中,对于每个节点 $u$,如果有 $d_u+d_{uw}=d_v$,其中 $w$ 是 $u$ 的某个子节点,那么就说明从 $u$ 到 $w$ 的路径经过了直径的终点 $w$,因此将 $cnt$ 加一。最终统计直径的数量就是 $cnt$。
时间复杂度为 $O(n)$。
阅读全文