1245 樹的直徑

2021-10-14 01:43:46 字數 2078 閱讀 6804

題目描述:

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

我們用乙個由所有「邊」組成的陣列 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 ...