樹的直徑定義:樹中所有最短路徑的最大值。
定義distance(a, b)為頂點a與b之間的最短距離。
用數學語言表示就是:對於一棵樹 t = (v, e),彐vx, vy ∈ v,
∀ v1, v2∈v, 都有distance(v1, v2) < distance(vx, vy). 則把vx到vy的最短路徑稱為樹t的直徑。
現在我們來用演算法求解樹的直徑。
求解過程很簡單,兩次bfs。
(1)第一次bfs我們可以從任意頂點出發,不妨設該頂點為 t, 找到距離 t 最遠的頂點u。則u一定為樹的直徑中的某乙個頂點。
(2)第二次bfs我們需要從頂點u出發,這次找到距離u最遠的頂點v,則u到v的最短路徑就是樹的直徑。
證明:假設樹的直徑為 u - v
①假設 t 是 u - v這條路徑上的點,同時我們找到距離 t 最遠的點是p, p ≠u 且 p ≠ v。那麼, distance(t , p) > distance(t, v)且distance(t, p) > distance(t, u)。故有distance(t, p) + distance(t , v) > distance(u, v) 或 distance(t, p)+ distance(t, u) > distance(u, v)。 這與 u-v是直徑矛盾。
② i :如果 t 不是 u - v這條路徑上的點,但 t 在找距其最遠的點時經過了u - v路徑上的某個點,則 回到情況①。
ii:如果 t 不是 u - v這條路徑上的點,並且 t 在找距其最遠的點時沒有經過u - v路徑上的點。同樣,我們找到距離 t 最遠的點是p, p ≠u 且 p ≠ v。
這個時候,我們設從t 到直徑上會經過點 q。
顯然有 distance(t , p) > distance(q, v)且distance(t, p) > distance(q, u)。不妨設distance(q, u) > distance(q, v).
同時有 distance(q, p) = distance(q, t) + distance(t, p) > distance(q, v), 所以有 distance(q, p) + distance(q, u) > distance (q, u) + distance(q, v)。
這與u-v是直接相矛盾。
證畢。hdu4607題意:給定一棵樹,每兩點間的距離都是 1,從任意乙個頂點出發,訪問k個點(包括起點),要求走的距離最小。求最小距離。
思路:顯然,從直徑的頂點出發,如果一直走直徑,則每次訪問乙個點只需要 1 的距離(沒有更短的距離了),所以,當 k < 直徑時,就直接輸出 k - 1.當 k > 直徑時,需要訪問的點除了直徑上的點,還有(k - 直徑)個點,那麼不管怎麼走,都必須回到直徑上來。離開直徑,回到直徑的距離就是(k - 直徑)* 2.最後答案別忘了減1.因為起點也算在內。
#include#include#include#include #include#include #includeusing namespace std;
const int n = 100000+16;
typedef vector::iterator vi;
typedef pairpairii;
vectorg[n];
queueque;
int lev[n];
int vis[n];
pairii bfs(int s)}}
pairii ret = make_pair(v, maxlev);
return ret;
}int main()
pairii t1 = bfs(1);
pairii t2 = bfs(t1.first);
int diameter = t2.second;
for(int i = 0; i < m; i++)
}return 0;
}
HDU4607 樹的直徑
樹的直徑的求法,任取一點u為起點,bfs出一條最長路徑,假設此時終點為v,則再次以v為起點,再bfs出一條最長路徑v w。可以得出樹的直徑即為所求。證明略。可以直接bfs或者dfs都行,來發水題 author crazy 石頭 data structure 樹的直徑 created time 201...
hdu 4607 求樹的直徑
分析後就是求樹的直徑兩次bfs即可 證明 樹的直徑是指樹的最長簡單路。求法 兩遍bfs 先任選乙個起點bfs找到最長路的終點,再從終點進行bfs,則第二次bfs找到的最長路即為樹的直徑 原理 設起點為u,第一次bfs找到的終點v一定是樹的直徑的乙個端點 證明 1 如果u 是直徑上的點,則v顯然是直徑...
hdu 4607 樹形dp 樹的直徑
題目大意 給你n個點,n 1條邊,將圖連成一棵生成樹,問你從任意點為起點,走k k n 個點,至少需要走多少距離 每條邊的距離是1 思路 樹形dp求樹的直徑r a 若k r 1 ans k 1 b 若k r 1,ans r k r 1 2 include include includeusing n...