zoukankan      html  css  js  c++  java
  • Minimum Height Trees 解答

    Question

    For an 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 :

    Input: n = 4, edges = [[1, 0], [1, 2], [1, 3]]
    
            0
            |
            1
           / 
          2   3 
    
    Output: [1]
    

    Example 2 :

    Input: n = 6, edges = [[0, 3], [1, 3], [2, 3], [4, 3], [5, 4]]
    
         0  1  2
           | /
            3
            |
            4
            |
            5 
    
    Output: [3, 4]

    Note:

    • 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.”
    • The height of a rooted tree is the number of edges on the longest downward path between the root and a leaf.

    Solution

    如果是一条线的话,我们知道选中间的点当root会是minimum height tree。类似的,如果是一堆点,我们通过BFS一层层拨开外面的叶子,那么剩下的就是中心的点。一开始还是需要构建图的adjacency list。

    BFS时间复杂度是O(N)

     1 class Solution:
     2     def findMinHeightTrees(self, n: int, edges: List[List[int]]) -> List[int]:
     3         if n == 1:
     4             return [0]
     5         adjacency_list = [set() for i in range(n)]
     6         # Build adjacnecy list
     7         for edge in edges:
     8             adjacency_list[edge[0]].add(edge[1])
     9             adjacency_list[edge[1]].add(edge[0])
    10         # Build leaves list
    11         leaves = [i for i in range(n) if len(adjacency_list[i]) == 1]
    12         # BFS
    13         while n > 2:
    14             n -= len(leaves)
    15             new_leaves = []
    16             while leaves:
    17                 leaf = leaves.pop()
    18                 neighbor = adjacency_list[leaf].pop()
    19                 adjacency_list[neighbor].remove(leaf)
    20                 if len(adjacency_list[neighbor]) == 1:
    21                     new_leaves.append(neighbor)
    22             leaves = new_leaves
    23         return leaves
  • 相关阅读:
    [C#] 主窗口嵌入子窗口(绑架窗口)
    【WP7】后台加载数据BackgroundWorker
    【WP7】手势操作与拨号键盘
    【算法】拼音匹配算法(支持多音字)
    【笔记】歌词显示问题
    【笔记】使用千千静听服务器下载歌词
    【WP7】代码创建png图片
    【WP7】自定义字体
    【WP7】对象序列化
    【WP7】控件倾斜特效
  • 原文地址:https://www.cnblogs.com/ireneyanglan/p/11517863.html
Copyright © 2011-2022 走看看