牛客题霸 [ 树的直径] C++题解/答案
生活随笔
收集整理的這篇文章主要介紹了
牛客题霸 [ 树的直径] C++题解/答案
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
牛客題霸 [ 樹的直徑] C++題解/答案
題目描述
給定一棵樹,求出這棵樹的直徑,即兩個節點距離的最大值。
題解:
不知道大家聽沒聽過一個結論:
樹的直徑可以通過兩邊dfs找到
步驟:
1.從任意一點進行dfs,然后找到一個最長路徑,記錄最遠點u
2.然后從u再進行dfs,找最長路徑,記錄一點v。
(u,v)就是樹的直徑
證明:
我們可以看出圖中,樹的直徑是(4->2->5),長度為9.
我們一開始選定一個點dfs
如果是直徑外一點,比如w1,從w1進行dfs找到的就是點4,路徑就1->2->4,這個路徑一定會與樹的直徑相交,而找到的4是直徑的一端,那從4再進行dfs就是樹的直徑的另一端5,這樣兩遍dfs你就找到了樹的直徑
如果是直徑內一點,比如w2,從w2開始dfs找到的最遠點4,這個路徑會被包含在樹的直徑里,那找到的點也就是樹直徑的一端,再dfs就可以找到另一端。
綜上用兩遍dfs就可以找到樹的直徑
其實求直徑也就是求深度,所以我們dfs直接求樹的深度,并記錄最大深度,以及對應的節點,然后再帶入到第二遍dfs即可
代碼:
/*** struct Interval {* int start;* int end;* };*/class Solution { public:/*** 樹的直徑* @param n int整型 樹的節點個數* @param Tree_edge Interval類vector 樹的邊* @param Edge_value int整型vector 邊的權值* @return int整型*/int far,Max;vector<vector<pair<int,int> >>G;void dfs(int u,int deep,int fa){if(deep>Max){far=u;Max=deep;}for(auto &it:G[u]){int v=it.first;int w=it.second;if(v==fa)continue;dfs(v,deep+w,u);}}int solve(int n, vector<Interval>& Tree_edge, vector<int>& Edge_value) {// write code hereG.clear(); G.resize(n + 1);for (int i = 0; i < n - 1; ++i) {Interval e = Tree_edge[i];int w = Edge_value[i];int u=e.start;int v=e.end;G[u].push_back(pair<int,int>(v, w));G[v].push_back(pair<int,int>(u, w));}far = 1; Max = 0;dfs(1, 0, 0);dfs(far, 0, far);return Max;} };總結
以上是生活随笔為你收集整理的牛客题霸 [ 树的直径] C++题解/答案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从头说起:基金采取券商结算模式的依据和影
- 下一篇: 牛客题霸 [ 缺失数字] C++题解/答