找學生 (樹的直徑)

2022-04-12 06:19:06 字數 1116 閱讀 2780

這道題其實就是一道無根樹上樹的直徑的問題:

如圖,首先根據上面的做法,用兩次bfs求出樹的直徑,即ab。

那麼其實發現在實際上,問題要求max(bc只要確定了直徑的端點a、b,然後再列舉c點,求得最大值即為答案。

**:

1 #include2 #include3 #include4 #include5

using

namespace

std;

6 typedef long

long

ll;7

const

int maxn=200005; 8

struct

nodeedge[maxn<<1

];11

ll d[maxn],k[maxn],head[maxn],vis[maxn];

12int

n,m,tot;

13 queueq;

14void add(int u,int v,int

w)20

int bfs(int

s)37}38

}39return

max;40}

41int

main()

50int l=bfs(1);//

a 51

int r=bfs(l);//

b52 ll ans=d[r];//

直徑長度

53for(int i=1;i<=n;i++) k[i]=d[i];//

k:ac長度

54bfs(r);

55 ll m=0;56

for(int i=1;i<=n;i++) m=max(m,min(d[i],k[i]));//

列舉c點 d:bc長度

57 printf("

%lld\n

",ans+m);

58return0;

59 }

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