CF 120F Spider 樹的直徑 簡單題

2022-08-22 04:24:10 字數 1289 閱讀 3996

乙個男孩有n只玩具蜘蛛,每只蜘蛛都是乙個樹的結構,現在男孩準備把這n只小蜘蛛通過貼上節點接在一起,形成乙隻大的蜘蛛。大的蜘蛛也依然是樹的結構。輸出大的蜘蛛的直徑。

知識:樹的直徑是指樹上的最長簡單路

求樹的直徑有個結論:

假設s-t這條路徑為樹的直徑,或者稱為樹上的最長路。

從任意一點u出發搜到的最遠的點一定是s、t中的一點,然後再從這個最遠點開始搜,就可以搜到另乙個最長路的端點,即用兩遍廣搜或者深搜就可以找出樹的最長路

證明:反證法。

那回到這道題,要使得大蜘蛛的直徑最大,就要使連線的小蜘蛛都是用s,t2個點來和其他蜘蛛連線

所以大蜘蛛的直徑就是小蜘蛛的直徑的和

1 #include2 #include3 #include4

5using

namespace

std;67

const

int maxn=105;8

const

int inf=0x3f3f3f3f;9

10struct

edge11;

14 edge edge[maxn<<1

];15

inthead[maxn];

16int

tot;

17bool

vis[maxn];

18struct

point19;

2223

void

init()

2428

29void addedge(int u,int

v)30

3536

//返回樹的直徑

37int solve(int

m);38

//返回結構體,樹的節點和節點到u的距離

39 point bfs(int u,int

m);40

41int

main()

4260 ans+=solve(m);61}

62 printf("

%d\n

",ans);

6364

return0;

65}6667

int solve(int

m)68

7374 point bfs(int s,int

m)75

95for(int i=head[u.num];~i;i=edge[i].next)

96106

}107

return

ret;

108 }

view code

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