URAL1056 樹的直徑

2021-06-21 14:23:12 字數 774 閱讀 6399

題目要求找到所有中心點,中心點是距離其最遠的點的距離最小的頂點。

我們知道從任何一點出發dfs其最遠的點所經過的路徑必與樹的直徑有交點。

若該點不在樹的直徑上,則不可能是中心點,因為取樹直徑的中點可以使得距離其最遠的點的距離更小。

還有一種情況是樹擁有多條直徑,細推一下所有直徑的中點是會重合的。(若直徑包含偶數個點,則有2個點重合;若直徑包含奇數個點,則有1個點重合)

因此根據直徑的奇偶性輸出樹的直徑的中點即可,可能是乙個或者是兩個。

#include #include #include #include #include #include #include #include #include #include using namespace std;

int par[10005];

bool vstd[10005];

vectorv[10005];

int maxn;

int record;

void dfs(int v,int depth)

} if (!flag && depth>maxn) }

int main()

dfs(1,0);

memset(vstd,false,sizeof(vstd));

maxn=0;

dfs(record,0);

if (maxn%2==0)

else

{ for (i=1;i<=maxn/2;i++)

record=par[record];

if (record

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