牛客題霸 [ 樹的直徑] 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 ;
*/class
solution
for(
auto
&it:g[u])}
intsolve
(int n, vector
& tree_edge, vector<
int>
& edge_value)
far =
1; max =0;
dfs(1,
0,0)
;dfs
(far,
0, far)
;return max;}}
;
牛客題霸 樹的直徑 C 題解 答案
牛客題霸 樹的直徑 c 題解 答案 給定一棵樹,求出這棵樹的直徑,即兩個節點距離的最大值。不知道大家聽沒聽過乙個結論 樹的直徑可以通過兩邊dfs找到 步驟 1.從任意一點進行dfs,然後找到乙個最長路徑,記錄最遠點u 2.然後從u再進行dfs,找最長路徑,記錄一點v。u,v 就是樹的直徑 證明 我們...
牛客題霸 求路徑 C 題解 答案
牛客題霸 求路徑 c 題解 答案 乙個機械人在m n大小的地圖的左上角 起點,下圖中的標記 start 的位置 機械人每次向下或向右移動。機械人要到達地圖的右下角。終點,下圖中的標記 finish 的位置 可以有多少種不同的路徑從起點走到終點?原本想遞迴做,發現複雜度過高 動態規劃做法 我們先設定邊...
牛客題霸 括號序列 C 題解 答案
牛客題霸 括號序列 c 題解 答案 給出乙個僅包含字元 和 的字串,判斷給出的字串是否是合法的括號序列 括號必須以正確的順序關閉,和 都是合法的括號序列,但 和 不合法。用棧來做 用棧來存每個符號的左邊,當出現符號右邊時,看棧的頂部是否為該符號的左邊,如果不能匹配則返回0,能匹配則將棧頂pop 全部...