BDFZOI 樹的直徑

2022-08-01 06:33:18 字數 1386 閱讀 1137

提交次數:2

涉及知識:基礎圖論/bfs

描述

一棵樹t的「直徑」定義為結點兩兩間距離的最大值。給定帶權樹t,求t的直徑長度。

輸入

第一行包含2個整數n、m,表示圖中共有n個結點和m條無向邊。(n <= 5000,m

接下來m行,每行包含3個整數,表示有一條無向邊連線結點u、v

*輸入保證是無環圖輸出乙個整數,代表直徑長度

樣例輸入

4 31 2 1

2 3 2

2 4 3

樣例輸出

5**:

1 #include2 #include3 #include4 #include5

using

namespace

std;

6struct

node9};

10struct

bnode

13};

14 vector>tree(5005

);15 queueq;

16bool visited[5005

];17

int dis[5005

];18

int firstu, diameter; //

第一次bfs擴充套件到的點

19int

n, m;

2021

void bfs(int

u)25 q.push(bnode(u,0

));26

while(!q.empty())34}

35 dis[bb.x] =bb.step;

36q.pop();37}

38 diameter = -1;39

for(int i = 1; i <= n; i++)44}

45}46int

main()

54 bfs(1

);55

//cout<56

bfs(firstu);

57 cout58return0;

59 }

備註:

樹的直徑,顧名思義,就是樹上一條最長路,乙個經典演算法就是兩次bfs。證明略,因為我不會。

先從樹上任意乙個點出發bfs到頭,這時這個端點一定是直徑的一端,證明略……這是第一遍bfs。

然後再從這個點bfs到頭,找到的最長路就是直徑。 這是第二遍bfs。

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 ...