换跟DP
树是一个无向图,其中任何两个顶点只通过一条路径连接。 换句话说,一个任何没有简单环路的连通图都是一棵树。
给你一棵包含 n
个节点的树,标记为 0
到 n - 1
。给定数字 n
和一个有 n - 1
条无向边的 edges
列表(每一个边都是一对标签),其中 edges[i] = [ai, bi]
表示树中节点 ai
和 bi
之间存在一条无向边。
可选择树中任何一个节点作为根。当选择节点 x
作为根节点时,设结果树的高度为 h
。在所有可能的树中,具有最小高度的树(即,min(h)
)被称为 最小高度树 。
请你找到所有的 最小高度树 并按 任意顺序 返回它们的根节点标签列表。
树的 高度 是指根节点和叶子节点之间最长向下路径上边的数量。
示例 1:
1 |
|
示例 2:
1 |
|
提示:
1 <= n <= 2 * 104
edges.length == n - 1
0 <= ai, bi < n
ai != bi
- 所有
(ai, bi)
互不相同 - 给定的输入 保证 是一棵树,并且 不会有重复的边
换跟DP解法,对于本题而言如果能够求出以0为根,每个节点向下的最大值mx_down[i]
和向上的最大值up[i]
,就能求出哪些点是最小高度的根,向下的最大值很好求,只需要dfs一遍即可,向上的最大值,需要根据情况来判断,设p
为u
的父节点,up[u] = max(up[p] + 1, up[u])
,此外如果u
是p
向下最大的子节点的话,up[u] = max(up[u], smx_down[p] + 1)
,sxm_down
为向下的次大值,如果u
不是p
向下的最大子节点的话,那么up[u] = max(up[u], mx_down[p] + 1)
,下面的图为三种情况。
此题的另种思路需要数学证明,不会证明。
1 |
|
换跟DP
http://example.com/2024/03/17/换跟DP/