樹的直徑 板子

2021-08-04 04:26:05 字數 1112 閱讀 5494

不帶解釋版模板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)

} fill(dis1,0); fill(dis2,0);

max_len = -1;

dd(1,-1,0,1);

ed = st;

max_len = -1;

dd(st,-1,0,1);

swap(st,ed);

dd(ed,-1,0,0);

帶解釋版模板

//其餘的不用關心.

void dd(int u, int fa, ll len,int flag)

//dis1和dis2分別代表樹的不同端點到樹上每乙個點的距離是多少.

fill(dis1,0); fill(dis2,0);

max_len = -1;

dd(1, -1, 0, 1); //先隨便找乙個點進行搜尋.

ed = st; //搜到最遠的那個點一定是樹的直徑的某一端.

max_len = -1;

dd(st, -1, 0, 1); //在以這個點去搜尋最遠的那個點就是直徑的另乙個端點值.

swap(st, ed);

dd(ed, -1, 0, 0); //把每乙個端點對樹上每乙個點的距離都算了一遍.

附上乙個單純on求樹的直徑的, 只是單純需要樹的直徑的, 有些題就是這樣

int maxlen = -1;

vector

g[maxn];

int dfs(int u,int fa)

if( fir + sec > maxlen ) maxlen = fir+sec;

return fir+1;

}//實際上就是儲存樹上到的每乙個點到其它點的最遠距離和次遠距離,然後不斷更新答案即可.

藍橋 大臣的旅費 樹的直徑板子題

思路 兩次dfs即可,第一次找到端點 第二次搜端點找到最大值即可 include include include include include include include define ll long long define inf 0x3f3f3f3f define sd a scanf d...

SDOI2013 直徑(樹的直徑)

小q最近學習了一些圖論知識。根據課本,有如下定義。樹 無迴路且連通的無向圖,每條邊都有正整數的權值來表示其長度。如果一棵樹有n個節點,可以證明其有且僅有n 1 條邊。路徑 一棵樹上,任意兩個節點之間最多有一條簡單路徑。我們用 dis a,b 表示點a和點b的路徑上各邊長度之和。稱dis a,b 為a...

樹的直徑相關

一.樹直徑的定義.顯然一棵樹可以有不止一條直徑.二.樹直徑的求解.一般來說樹的直徑可以用樹形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 ...