leetcode@ [310] Minimum Height Trees
For a undirected graph with tree characteristics, we can choose any node as the root. The result graph is then a rooted tree. Among all possible rooted trees, those with minimum height are called minimum height trees (MHTs). Given such a graph, write a function to find all the MHTs and return a list of their root labels.
Format
The graph contains n nodes which are labeled from 0 to n - 1. You will be given the number n and a list of undirected edges (each edge is a pair of labels).
You can assume that no duplicate edges will appear in edges. Since all edges are undirected, [0, 1] is the same as [1, 0] and thus will not appear together in edges.
Example 1:
Given n = 4, edges = [[1, 0], [1, 2], [1, 3]]
0
|
1
/ \
2 3
return [1]
Example 2:
Given n = 6, edges = [[0, 3], [1, 3], [2, 3], [4, 3], [5, 4]]
0 1 2
\ | /
3
|
4
|
5
return [3, 4]
Hint:
- How many MHTs can a graph have at most?
Note:
(1) According to the definition of tree on Wikipedia: “a tree is an undirected graph in which any two vertices are connected by exactly one path. In other words, any connected graph without simple cycles is a tree.”
(2) The height of a rooted tree is the number of edges on the longest downward path between the root and a leaf.
public class Solution {
/** return the height of tree if let s to be the root of the tree */
public static int bfs(ArrayList<ArrayList<Integer> > g, int s) {
HashSet<Integer> upper = new HashSet<Integer> ();
HashSet<Integer> lower = new HashSet<Integer> ();
HashSet<Integer> vis = new HashSet<Integer> ();
upper.add(s);
vis.add(s);
int lv = 1;
while(!upper.isEmpty()) {
for(int u: upper) {
ArrayList<Integer> adj = g.get(u);
for(int i=0; i<adj.size(); ++i) {
int adj_node = adj.get(i);
if(!vis.contains(adj_node)) {
lower.add(adj_node);
}
}
}
if(!lower.isEmpty()) {
++lv;
}
upper.clear();
for(int c: lower) {
vis.add(c);
upper.add(c);
}
lower.clear();
}
return lv;
}
public static ArrayList<Integer> topologicalSort(int n, int[][] edges, ArrayList<ArrayList<Integer> > g) {
ArrayList<Integer> topo = new ArrayList<Integer> ();
int[] d = new int[n];
for(int i=0; i<edges.length; ++i) {
int u = edges[i][0], v = edges[i][1];
++d[u]; ++d[v];
}
LinkedList<Integer> queue = new LinkedList<Integer> ();
for(int i=0; i<n; ++i) {
if(d[i] == 1) {
queue.addLast(i);
}
}
while(!queue.isEmpty()) {
int top = queue.pollFirst();
topo.add(top);
ArrayList<Integer> adj = g.get(top);
for(int next: adj) {
d[next]--;
if(d[next] == 1) {
queue.addLast(next);
}
}
}
return topo;
}
public List<Integer> findMinHeightTrees(int n, int[][] edges) {
List<Integer> rs = new ArrayList<Integer> ();
if(n == 1) {
rs.add(0);
return rs;
}
ArrayList<ArrayList<Integer> > g = new ArrayList<ArrayList<Integer> > ();
for(int i=0; i<n; ++i) {
ArrayList<Integer> row = new ArrayList<Integer> ();
g.add(row);
}
for(int i=0; i<edges.length; ++i) {
int u = edges[i][0];
int v = edges[i][1];
g.get(u).add(v);
g.get(v).add(u);
}
HashMap<Integer, Integer> mapping = new HashMap<Integer, Integer> ();
ArrayList<Integer> topo = topologicalSort(n, edges, g);
int idx = topo.get(topo.size()-1);
int min_lv = bfs(g, idx);
rs.add(idx);
if(topo.size() >= 2) {
int indice = topo.get(topo.size()-2);
if(bfs(g, indice) == min_lv) {
rs.add(indice);
}
}
return rs;
}
}
leetcode@ [310] Minimum Height Trees的更多相关文章
- [LeetCode] 310. Minimum Height Trees 解题思路
For a undirected graph with tree characteristics, we can choose any node as the root. The result gra ...
- [LeetCode] 310. Minimum Height Trees 最小高度树
For a undirected graph with tree characteristics, we can choose any node as the root. The result gra ...
- 【LeetCode】310. Minimum Height Trees 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 BFS 相似题目 参考资料 日期 题目地址:http ...
- 310. Minimum Height Trees
For a undirected graph with tree characteristics, we can choose any node as the root. The result gra ...
- [LeetCode] 310. Minimum Height Trees_Medium tag: BFS
For a undirected graph with tree characteristics, we can choose any node as the root. The result gra ...
- 310. Minimum Height Trees -- 找出无向图中以哪些节点为根,树的深度最小
For a undirected graph with tree characteristics, we can choose any node as the root. The result gra ...
- [LeetCode] Minimum Height Trees 最小高度树
For a undirected graph with tree characteristics, we can choose any node as the root. The result gra ...
- LeetCode Minimum Height Trees
原题链接在这里:https://leetcode.com/problems/minimum-height-trees/ 题目: For a undirected graph with tree cha ...
- Minimum Height Trees -- LeetCode
For a undirected graph with tree characteristics, we can choose any node as the root. The result gra ...
随机推荐
- Filter设计实现IP地址限制
示例:创建一个IP过滤Filter,当一个用户发出访问请求的时候,首先通过过滤器进行判断, 如果用户的IP地址被限制,就禁止访问,只有合法的IP才可以继续访问.IP过滤Filter代码如下: IPFi ...
- 计算机技能get(windows系统)
1.快速打开程序,比如计算器,注册表,先按win键(不用再按win+r啦),输入程序名字,如calc,regedit等,直接打开. 2.自动左右分屏,win+上下左右方向键,win+↑ 最大化,win ...
- KMP入门题目[不定期更新]
HDU 1711 Number Sequence(模板题) #include <cstdio> ; ; int N, M; int textS[MAXN]; int tarS[MAXL]; ...
- PHP Redis 集群封装类
<?php /** * Redis 操作,支持 Master/Slave 的负载集群 * * @author V哥 */ class RedisCluster{ // 是否 ...
- ios ableviewcell的动态加载数据,模仿喜马拉雅动态数据加载
iphone(UITableViewCell)动态加载图片http://developer.apple.com/library/ios/#samplecode/LazyTableImages/Intr ...
- 用imagemagick和tesseract-ocr破解简单验证码
用imagemagick和tesseract-ocr破解简单验证码 Tesseract-ocr据说辨识程度是世界排名第三,可谓神器啊. 准备工作: 1.安装tesseract-ocr sudo apt ...
- asp.net 2.0中新增的web.config的默认namespace功能 (转)
看上去这个题目比较长,但实际上,我在看资料时发现,这就是说,在asp.net 2.0中,只需要在web.config里定义你要用的那些namespace,则在aspx页面中就不需要再象1.1那样,用 ...
- 【多端应用开发系列0.0.0——之总序】xy多端应用开发方案定制
[目录] 0.0.0 [多端应用开发系列之总序]服务器Json数据处理——Json数据概述 0.0.0 [因] 正在学习多客户端应用开发,挖个坑,把所用到的技术方案,用最简单直白的语言描述出来,写成一 ...
- RTP封装h264
网络抽象层单元类型 (NALU): NALU头由一个字节组成,它的语法如下: +---------------+ |0|1|2|3|4|5|6|7| +-+-+-+-+-+-+-+ ...
- H.264学习笔记之一(层次结构,NAL,SPS)
一 H.264句法 1.1元素分层结构 H.264编码器输出的Bit流中,每个Bit都隶属于某个句法元素.句法元素被组织成有层次的结构,分别描述各个层次的信息. 图1 H.264分层结构由五层组成,分 ...