内容简介:题目地址:题目描述:
题目地址:
https://leetcode-cn.com/probl...
题目描述:
对于一个具有树特征的无向图,我们可选择任何一个节点作为根。图因此可以成为树,在所有可能的树中,具有最小高度的树被称为最小高度树。给出这样的一个图,写出一个函数找到所有的最小高度树并返回他们的根节点。
格式
该图包含 n 个节点,标记为 0 到 n - 1。给定数字 n 和一个无向边 edges 列表(每一个边都是一对标签)。
你可以假设没有重复的边会出现在 edges 中。由于所有的边都是无向边, [0, 1]和 [1, 0] 是相同的,因此不会同时出现在 edges 里。
解答:
这一题就是求最短路径,不过求的是每一个点到任意一点的最短路径。
我们可以使用 弗洛伊德
算法来求解。可惜的是该算法的复杂度是O(N三次方)。
不过还有别的方法来求最短路径,宽度优先搜索,对于权值相同的图,可以用宽度优先搜索来求解某一点到
任意一点的最短路径。宽度优先是O(N)的复杂度。求解N个点的,于是就可以把复杂度变为O(N二次方)。
注意:下面的代码是隐含使用宽度优先搜索,没有使用队列。
java ac代码:
class Solution {
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
int[][] matrix = new int[n][n];
int max = Integer.MAX_VALUE;
for(int i = 0;i < n;i++)
for(int j = 0;j < n;j++)
matrix[i][j] = max;
for(int i = 0;i < edges.length;i++){
int begin = edges[i][0];
int end = edges[i][1];
matrix[begin][end] = 1;
matrix[end][begin] = 1;
for(int j = 0;j < n;j++)
if(matrix[begin][j] == max&&matrix[end][j] != max)
matrix[begin][j] = matrix[j][begin] = 1+matrix[end][j];
else if(matrix[end][j] == max&&matrix[begin][j] != max)
matrix[end][j] = matrix[j][end] = 1+matrix[begin][j];
}
for(int i = 0;i < n;i++)
matrix[i][i] = 0;
HashMap<Integer,Integer>map = new HashMap(1<<10);
int min = max;
for(int i = 0;i < n;i++){
int temp = -1;
for(int j = 0;j < n;j++)
temp = Math.max(temp,matrix[i][j]);
map.put(i,temp);
min = Math.min(temp,min);
}
List<Integer> ans = new ArrayList(n);
for(Map.Entry<Integer,Integer> entry:map.entrySet())
if(entry.getValue() == min)ans.add(entry.getKey());
return ans;
}
}
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
与孩子一起学编程
[美] 桑德Warren Sande、Carter Sande / 苏金国、姚曜 等 / 人民邮电出版社 / 2010-11 / 65.00元
一本老少咸宜的编程入门奇书!一册在手,你完全可以带着自己的孩子,跟随Sande父子组合在轻松的氛围中熟悉那些编程概念,如内存、循环、输入和输出、数据结构和图形用户界面等。这些知识一点儿也不高深,听起来备感亲切,书中言语幽默风趣而不失真义,让学习过程充满乐趣。细心的作者还配上了孩子们都喜欢的可爱漫画和经过运行测试的程序示例,教你用最易编写和最易理解的Python语言,写出你梦想中的游戏程序。 ......一起来看看 《与孩子一起学编程》 这本书的介绍吧!