力扣(LeetCode)310

Linus脫襪子發表於2019-01-19

題目地址:
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;
    }
    
    
}

相關文章