牛客題霸 樹的直徑 C 題解 答案

2021-10-10 06:55:42 字數 980 閱讀 9650

牛客題霸 [ 樹的直徑] 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 全部...