如何求樹的直徑和中心

2021-10-09 12:29:20 字數 1743 閱讀 2627

​ 樹的直徑就是從找到一條最長路徑(不經過重複節點) 時間複雜度o(n) 需要把整棵樹遍歷一遍

思路:動態規劃思想:求出經過各個點的最長路徑 取max 就是樹的最長路徑

#include

#include

#include

using namespace std;

const

int n =

2e4;

int h[n]

,e[n]

,ne[n]

,val[n]

,idx;

int ans =0;

int n;

void

add(

int a,

int b,

int c)

intdfs

(int u,

int fa)

//返回以其為根節點的子樹內的 以根節點為乙個端點的最大路徑

else

if(d>d2)

d2 = d;

}

ans =

max(ans,d1+d2)

;return d1;

}int

main()

dfs(1,

-1);

cout

}

中心點的定義:中心點到樹中其他結點的最遠距離最近

實現**:

#include

#include

#include

#include

using namespace std;

const

int n =

2e4+10;

int h[n]

,e[n]

,ne[n]

,val[n]

,idx;

int d1[n]

;int d1_c[n]

;int d2[n]

;int d2_c[n]

;int up[n]

;int maxx;

int n;

void

add(

int a,

int b,

int c)

intdfs_down

(int u,

int fa)

else

if(d>d_maxx)

d_maxx = d,d2_c[u]

= j;

} d1[u]

= d_max;

d2[u]

= d_maxx;

return d1[u];}

void

dfs_up

(int u,

int fa)

}int

main()

dfs_down(1

,-1)

;dfs_up(1

,-1)

;

maxx =

0x3f3f3f3f

;for

(int i=

1;i<=n;i++

) maxx =

min(maxx,

max(up[i]

,d1[i]))

;

cout

}

求樹的直徑

歡迎來踩本人部落格 樹的直徑 就是樹上最長路 方法 求兩邊dfs即可 步驟 1.從任意一點進行dfs,然後找到乙個最長路徑,記錄最遠點u 2.然後從u再進行dfs,找最長路徑,記錄一點v。u,v 就是樹的直徑 第四屆藍橋杯a組 證明 我們可以看出圖中,樹的直徑是 4 2 5 長度為9.我們一開始選定...

求樹的直徑

歡迎來踩本人部落格 樹的直徑 就是樹上最長路 方法 求兩邊dfs即可 步驟 1.從任意一點進行dfs,然後找到乙個最長路徑,記錄最遠點u 2.然後從u再進行dfs,找最長路徑,記錄一點v。u,v 就是樹的直徑 第四屆藍橋杯a組 證明 我們可以看出圖中,樹的直徑是 4 2 5 長度為9.我們一開始選定...

求樹的直徑

由於之前寫了一篇部落格,用到了樹的直徑卻沒有求。在咕咕咕了n多天之後決定寫這篇部落格。樹的直徑就是樹中最長的一條路。求樹的直徑我只會一種方法 據說dalao都會2種 隨便找乙個點跑一遍最短路,找到離他最遠的節點a,然後從a節點繼續跑最短路,再次找到乙個離a最遠的節點b,a和b分別是直徑的兩個端點,他...