題目描述:
給你這棵「無向樹」,請你測算並返回它的「直徑」:這棵樹上最長簡單路徑的 邊數。
我們用乙個由所有「邊」組成的陣列 edges 來表示一棵無向樹,其中 edges[i] = [u, v] 表示節點 u 和 v 之間的雙向邊。
樹上的節點都已經用 中的數做了標記,每個節點上的標記都是獨一無二的。
示例 1:
輸入:edges = [[0,1],[0,2]]
輸出:2
解釋:這棵樹上最長的路徑是 1 - 0 - 2,邊數為 2。
示例 2:
輸入:edges = [[0,1],[1,2],[2,3],[1,4],[4,5]]
輸出:4
解釋:這棵樹上最長的路徑是 3 - 2 - 1 - 4 - 5,邊數為 4。
0 <= edges.length < 10^4
edges[i][0] != edges[i][1]
0 <= edges[i][j] <= edges.length
edges 會形成一棵無向樹
方法1:
(1)dfs;
(2)和求二叉樹中任意兩個結點之間的最長距離的思路一致,只不過變成了多叉樹的處理;
(3)由於是找任意的兩個結點之間的最長距離,故任意選擇乙個結點作為根節點,然後使用深度優先進行遍歷,求出各個結點的到終止點的最長的兩個距離,相加即為該節點所在路徑中,直徑最長的長度;
(4)dfs的返回值是該節點到各個終止點的長度中的最長長度加1;
(5)為了實現類似的數的遍歷,構建鄰接圖;
class
solution
else
if(max_tmp>max_d2)}}
max_d=
max(max_d,max_d1+max_d2)
;//更新可能的最長的長度
//返回當前結點的最長到終止點的長度
return
max(max_d1,max_d2)+1
;}inttreediameter
(vectorint>>
& edges)
int max_d=0;
//最長的直徑
//標識訪問過的結果
vector<
bool
>
sign
(edges.
size()
+1,false);
dfs(graph,sign,max_d,0)
;return max_d;}}
;
方法2:
主要思路:
(1)bfs;
(2)使用兩次bfs,第一次使用任意乙個結點作為起始點,進行bfs搜尋,找出最遠的乙個結點;
(3)再次使用bfs時,使用這個最遠的結點作為新的起始結點,進行bfs,找出到該結點的最遠結點的長度,即為最長直徑;
class
solution
vector<
bool
>
sign
(edges.
size()
+1,false);
queue<
int> q;
q.push(0
);sign[0]
=true
;int cur=0;
//第一次bfs,任意選乙個結點,找出其最遠的結點
while
(!q.
empty()
)}} sign=vector<
bool
>
(edges.
size()
+1,false);
q.push
(cur)
;int max_d=-1
;//找出新的結點的最遠結點的距離
while
(!q.
empty()
)}}}
return max_d;}}
;
SDOI2013 直徑(樹的直徑)
小q最近學習了一些圖論知識。根據課本,有如下定義。樹 無迴路且連通的無向圖,每條邊都有正整數的權值來表示其長度。如果一棵樹有n個節點,可以證明其有且僅有n 1 條邊。路徑 一棵樹上,任意兩個節點之間最多有一條簡單路徑。我們用 dis a,b 表示點a和點b的路徑上各邊長度之和。稱dis a,b 為a...
樹的直徑 板子
不帶解釋版模板o n 常數較大,但是可以知道樹上每一點到直徑端點的距離,這個大多時候都很有用 struct node e maxn 2 ll dis1 maxn dis2 maxn int st,ed,max len void dd int u,int fa,int len,int flag fil...
樹的直徑相關
一.樹直徑的定義.顯然一棵樹可以有不止一條直徑.二.樹直徑的求解.一般來說樹的直徑可以用樹形dp來求.設f i 0 1 f i 0 1 f i 0 1 表示在i ii的子樹中以i ii為一端的最長 次長鏈長度,我們可以很容易dp出來這個值,樹的直徑就是f i 0 f i 1 f i 0 f i 1 ...