以任意點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必爲樹的直徑,但是圖的直徑不能通過這種方法獲得。