《學習筆記》 樹的直徑 Bfs Dfs

2022-08-13 22:30:20 字數 1468 閱讀 7243

樹的直徑為樹上最長的一條路徑(不經過重複節點),也可以看做是樹上最長路。

通常的求法:

1.兩邊bfs或兩邊dfs

2.樹形dp(端點為根和僅經過根)。

emmm 。。蒟蒻表示目前只會第一種qaq。

從樹中找出任意一點,求出與他距離最遠的點s,再用同樣的方法求出與s距離最遠的點t,s-t即為樹的直徑。

bfs**

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;78

intn,l,r,cnt,pos,ans;

9int first[100010],next[200010

];10

int q[100010],de[100010

];11

bool used[100010

];12

13struct

maplerode[200010

];16

17void build(int f,int

t)18

;20 next[cnt]=first[f];

21 first[f]=cnt;22}

23void bfs(int

k)2441}

42 pos=q[head] ; ans=de[pos];43}

4445

intmain()

4654 bfs(1

);55

bfs(pos);

56 printf("%d"

,ans);

57return0;

58 }

dfs **

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;78

intn,l,r,cnt,pos,ans;

9int first[100010],next[200010

];10

11struct

maplerode[200010

];14

15void build(int f,int

t)16

;18 next[cnt]=first[f];

19 first[f]=cnt;20}

21void dfs(int k,int dis,int

fa)22

2829

intmain()

3038 dfs(1,0,-1

);39 dfs(pos,0,-1

);40 printf("%d"

,ans);

41return0;

42 }

例題:codevs 1814 最長鏈

poj2831 樹的直徑 bfs dfs

這裡給出樹的直徑的證明 主要是利用了反證法 假設 s t這條路徑為樹的直徑,或者稱為樹上的最長路 現有結論,從任意一點u出發搜到的最遠的點一定是s t中的一點,然後再從這個最遠點開始搜,就可以搜到另乙個最長路的端點,即用兩遍廣搜就可以找出樹的最長路 證明 1.設u為s t路徑上的一點,結論顯然成立,...

樹的直徑 學習筆記1(入門)

poj 2631 roads in the north 題目大意 給你一棵樹,求這棵樹的直徑。樹的直徑 樹中最長的簡單路徑。簡單路徑 路徑上各點均不重複。以下證明內容 這裡給出樹的直徑的證明 主要是利用了反證法 假設 s t這條路徑為樹的直徑,或者稱為樹上的最長路 現有結論,從任意一點u出發搜到的最...

樹的直徑與重心學習筆記

此文為完成任務所設,可能不易懂,能看懂就將就著看吧 樹的定義 不存在環且聯通的圖。樹的直徑 樹中的最長鏈 樹的重心 為乙個點,以此點為根,最大子樹的大小最小。樹的直徑求法分兩種 兩次 dfs bfs 與樹形 dp 首先講好理解點的樹形 dp 其實很簡單,每個節點維護子樹到這個點的最長鏈和次長鏈。對於...