從任意起點開始,執行一次bfs,得到乙個最遠點d1,d1即為直徑的一點
再執行一次bfs,得到乙個最遠點d2,則d1~d2為樹的直徑
為什麼這樣是對的?
(1)證明d1是樹直徑的一點
a) 若s在直徑d1,d2上,則最後乙個點必能搜到d1或d2;因為若搜到最後乙個點為v,則直徑為vd2,與題意不符
b) 若s不在直徑d1,d2上,bfs搜到的最遠點為v,d1-d2為直徑,根據連通圖的性質,
路徑s-v當中必有一點t1,與路徑d1-d2相連
.根據d1-d2直徑定義 d1d2=d2t2+t2d1,且t2d1>=t2t1+t1v,否則直徑為d2-t2-t1-v
根據v是bfs搜到的最遠點,t1v>=t1t2+t2d1,最遠點為d1
根據兩個不等式可得
t1t2=0
t1v=t2d1
(2)通過d1進行bfs,最後搜到的點必為d2
因為若搜到最後乙個點為v,則直徑為vd1,與題意不符
**:
演算法導論 22 2 7 樹的直徑
22.2 7 很顯然數的直徑就是樹的最長簡單路。先進行一次bfs 然後再從 bfs的終點再進行一次 bfs得到的最長路徑就是直徑。進行了兩次 bfs,所以複雜度還 o e v 參考自 樹的直徑是指樹的最長簡單路。求法 兩遍bfs 先任選乙個起點bfs找到最長路的終點,再從終點進行bfs,則第二次bf...
演算法導論 22 2 7 樹的直徑
樹t v,e 的直徑 diameter 定義為max u,v 亦即,樹的直徑是樹中所有最短路徑長度中的最大值。試寫出計算樹的直徑的有效演算法,並分析演算法的執行時間。step1 以樹中任意乙個結點為源點,進行一次廣度優先遍歷,找出離源點距離最遠的點d step2 以d為源點,進行一次廣度優先遍歷,找...
兩次BFS求樹的直徑 演算法導論22 2 7
以任意點w開始,先做一次bfs,找到最遠的點v,然後再以此點v進行一次bfs,找到最遠的點為u,u到v就是樹的直徑。此問題的關鍵不是在程式設計,而是要證明,網上也找了很多資料,沒有看到證明,以下是個人的證明方法。首先要知道樹是沒有環路的連通圖,任意兩點都有一條通路,而且也只有一條通路。同時假設樹的一...