LeetCode 1245 樹的直徑

地址 https://leetcode-cn.com/contest/biweekly-contest-12/problems/tree-diameter/算法

給你這棵「無向樹」,請你測算並返回它的「直徑」:這棵樹上最長簡單路徑的 邊數。數組

咱們用一個由全部「邊」組成的數組 edges 來表示一棵無向樹,其中 edges[i] = [u, v] 表示節點 u 和 v 之間的雙向邊。ide

樹上的節點都已經用 {0, 1, ..., edges.length} 中的數作了標記,每一個節點上的標記都是獨一無二的。spa

示例1code

輸入:edges = [[0,1],[0,2]]
輸出:2
解釋:
這棵樹上最長的路徑是 1 - 0 - 2,邊數爲 2

示例2blog

輸入:edges = [[0,1],[1,2],[2,3],[1,4],[4,5]]
輸出:4
解釋: 
這棵樹上最長的路徑是 3 - 2 - 1 - 4 - 5,邊數爲 4

算法1
求無向樹最遠距離 分爲兩步
1 任選一點 BFS或者DFS獲取離該點最遠的點
2 以第一步獲得的點爲起點 再次BFS或者DFS獲取距離最遠的點。二者距離就是最遠距離leetcode

C++ 代碼get

 1 class Solution {
 2 public:
 3     pair<int, int> bfs(vector<vector<int>>& e, int start) {
 4         vector<int> d(e.size(), -1);
 5 
 6         queue<int> Q;
 7         Q.push(start);
 8         d[start] = 0;
 9 
10         pair<int, int> ret;
11 
12         while (!Q.empty()) {
13             int x = Q.front();
14             Q.pop();
15             ret.first = x;
16             ret.second = d[x];
17             for (auto& y : e[x]) {
18                 if (d[y] == -1) {
19                     d[y] = d[x] + 1;
20                     Q.push(y);
21                 }
22             }
23         }
24         return ret;
25     }
26 
27     int treeDiameter(vector<vector<int>>& edges) {
28         int n = edges.size() + 1;
29         vector<vector<int>> e(n, vector<int>());
30         for (auto& edge: edges) {
31             e[edge[0]].push_back(edge[1]);
32             e[edge[1]].push_back(edge[0]);
33         }
34 
35         pair<int, int> p;
36         p = bfs(e, 0);
37         p = bfs(e, p.first);
38 
39         return p.second;
40     }
41 };
View Code
相關文章
相關標籤/搜索