題目描述:
給定一棵無向樹, 我們選擇不同的節點作為根節點時,可以得到不同的高度(即樹根節點到葉子節點距離的最大值), 現在求這棵樹可能的最低高度。
思路
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列表 每乙個邊都是一對標籤 你...