九度 1536 樹的最小高度

2021-09-06 14:07:45 字數 1766 閱讀 7747

題目描述:

給定一棵無向樹, 我們選擇不同的節點作為根節點時,可以得到不同的高度(即樹根節點到葉子節點距離的最大值), 現在求這棵樹可能的最低高度。

思路

1. 剛開始題目都沒看懂. 樹的高度, 指的是根節點到葉節點的最大值, 我們要做的是找到最大值中的最小值

2. 查了下資料, 發現這道題是裸求樹的直徑

3. 樹的直徑可以用動規求解, 但基本的求法是用兩次 bfs(dfs)

4. bfs 的求解過程為, (1) 從任意節點 u 出發, 找到其能夠達到的最遠的節點 v (2) 再從 v 出發, 找到其能夠達到的最遠的節點 o (3) v,o 之間的距離就是樹的直徑 (4) 直徑的一半就是所要求的高度

證明 4 的正確性

1. 假設 u 節點就在直徑上. 假設 v 不在直徑上, 那麼必然有一點 v2 在直徑上, 且 dis(u, v2) > dis(u,v), 這與 v 是 u 出發到達最遠的點矛盾, 所以 v 在直徑上(並且肯定在直徑的一端)

2. 假設 u 不在直徑上, 那麼 v 一定在直徑上, 否則必然存在乙個節點 v2 在直徑上, 且 dis(u, v2) > dis(u,v)....

3. 總之, v 一定在直徑的一端, o 在另一端

4. 關鍵點那題與這道類似

**

用 dfs 做的, bfs 記錄深度不太方便 

#include #include 

#include

#include

#include

using

namespace

std;

vector

tree[1000010

];bool visited[1000010

];int

depthindex, maxdepth;

void dfs(int n, int

depth)

for(int i = 0; i < tree[n].size(); i ++)

}int

main()

else

if(n == 2

)

inta, b;

for(int i = 0; i < n; i++)

tree[i].clear();

for(int i = 0; i < n-1; i ++)

maxdepth = 0

; depthindex = 0

; memset(visited,

0, n+10

); visited[

0] = 1

; dfs(

0,0);

memset(visited,

0, n+10

); maxdepth = 0

; visited[depthindex] = 0

; dfs(depthindex, 0);

int resval = maxdepth-((maxdepth)>>1

); printf(

"%d\n

", resval);

}return0;

}

題目1536 樹的最小高度

題目描述 給定一棵無向樹,我們選擇不同的節點作為根節點時,可以得到不同的高度 即樹根節點到葉子節點距離的最大值 現在求這棵樹可能的最低高度。輸入 輸入可能包含多個測試案例。對於每個測試案例,輸入的第一行為乙個整數n 1 n 1000000 接下n 1行,每行包括兩個整數u,v 0 u,v n 代表這...

九度 1154《最小生成樹》

北大10機試 1154 jungle roads wa 原因,初始化時為1 size 1,而使用時ch a 是從0開始的。但是,本地測試卻與答案相同!所以,優點隱蔽。所以初始化時,為0 size 1時,就安全保險了。還需要養成習慣,做到點的開始為1。除非規定了第乙個點為0.include inclu...

310 最小高度樹

對於乙個具有樹特徵的無向圖,我們可選擇任何乙個節點作為根。圖因此可以成為樹,在所有可能的樹中,具有最小高度的樹被稱為最小高度樹。給出這樣的乙個圖,寫出乙個函式找到所有的最小高度樹並返回他們的根節點。格式該圖包含n個節點,標記為0到n 1。給定數字n和乙個無向邊edges列表 每乙個邊都是一對標籤 你...