题目描述
对于一个具有树特征的无向图,我们可选择任何一个节点作为根。图因此可以成为树,在所有可能的树中,具有最小高度的树被称为最小高度树。给出这样的一个图,写出一个函数找到所有的最小高度树并返回他们的根节点。
格式:
该图包含 n
个节点,标记为 0
到 n - 1
。给定数字 n
和一个无向边 edges
列表(每一个边都是一对标签)。
你可以假设没有重复的边会出现在 edges
中。由于所有的边都是无向边, [0, 1]
和 [1, 0]
是相同的,因此不会同时出现在 edges
里。
示例:
输入: n = 4, edges = [[1, 0], [1, 2], [1, 3]]
0
|
1
/ \
2 3
输出: [1]
输入: n = 6, edges = [[0, 3], [1, 3], [2, 3], [4, 3], [5, 4]]
0 1 2
\ | /
3
|
4
|
5
输出: [3, 4]
说明:
- 根据树的定义,树是一个无向图,其中任何两个顶点只通过一条路径连接。 换句话说,一个任何没有简单环路的连通图都是一棵树。
- 树的高度是指根节点和叶子节点之间最长向下路径上边的数量。
给定代码
class Solution {
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
}
}
题解一
第一眼看到这个题,这不就是Floyd算法能解决的吗。
典型的多源最短路径问题,打完表之后,找到每个节点到任意节点的最长距离,就是树的高度了。
然后再选一个高度最小的即可。
思路很理想,但是超时了!!!
六十多个数据只过了五十多个,被一个800节点的图拦住了, O ( V 3 ) O(V^3) O(V3)可不是吹的。。。
代码如下:
class Solution {
private static final int MAX = 0x3f3f3f3f;
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
if (n == 0) {
return new ArrayList<>();
}
// 构建邻接表
int [][] dist = new int[n][n];
for (int [] di : dist) {
Arrays.fill(di, MAX);
}
for (int i = 0 ; i < n ; i++) {
dist[i][i] = 0;
}
for (int [] edge : edges)
{
dist[edge[0