題目要求找到所有中心點,中心點是距離其最遠的點的距離最小的頂點。
我們知道從任何一點出發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 ...