兩次BFS求樹的直徑(算法導論22.2-7)

以任意點w開始,先做一次BFS,找到最遠的點v,然後再以此點v進行一次BFS,找到最遠的點爲u,u到v就是樹的直徑。

 

此問題的關鍵不是在編程,而是要證明,網上也找了很多資料,沒有看到證明,以下是個人的證明方法。

 

首先要知道樹是沒有環路的連通圖,任意兩點都有一條通路,而且也只有一條通路。同時假設樹的一條直徑爲u到v的路徑,記爲d(u,v)。

分情況討論:

(1) 假設起始點w正好在直徑上,則此時以w爲起始點BFS,最遠的點必定爲直徑的一個端點,這是顯然的,否則可以找到一個比d(u,v)更長的通路,矛盾;

(2) 起始點w不在直徑上,以w作一次BFS,設最遠點爲x,假設w到x的路徑與直徑相交,則x必定爲直徑的某個端點,這個證明方法和(1)類似

(3) 起始點w不在直徑上,以w作一次BFS,設最遠點爲x,假設w到x的路徑d(w,x)與直徑d(u,v)不相交,以下證明這種情況(見下圖)。


d(w,v)必定和d(u,v)相交於不是v的點,因爲v是直徑的端點,故v的度必須爲1,否則可以找到更長的直徑。如此從w到v必然經過v的前一個結點,即和d(u,v)相交於不是u的點,假設交於點y。

設d(w,v)與d(w,x)共同點爲a,在d(w,x)中a的下一個結點爲z,由於d(w,x)爲以w爲端點的最長路徑,即d(w,x)>d(w,v),則d(z,x)>=d(y,v)。

目前找到了u到x的一條通路,這也是唯一一條通路d(u,x)

d(u,x)=d(y,u)+2+d(z,x)>=d(y,u)+d(y,v)+2>=d(u,v)+2,即d(u,x)比直徑d(u,v)還長,與原假設矛盾,故情況(3)也得證

 

綜上所述,兩次BFS必爲樹的直徑,但是圖的直徑不能通過這種方法獲得。

發佈了72 篇原創文章 · 獲贊 28 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章