樹的直徑 hdu 4607

2021-07-05 05:24:43 字數 1935 閱讀 4527

樹的直徑定義:樹中所有最短路徑的最大值。

定義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...