兩次BFS求樹的直徑 演算法導論22 2 7

2021-06-16 11:30:52 字數 890 閱讀 2485

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

樹的直徑 兩次dfs求樹的直徑

樹的直徑是一棵樹的某兩個最深的葉子節點的連線,多用於與圖論演算法巢狀考 1 很簡單的演算法,不會單獨考,學習和熟練使用它的多種情況 很簡單,兩次dfs 至於為什麼,可以畫圖模擬一下,因為一次dfs必然會在一棵子樹或者根節點上,每次dfs必然找到一棵子樹的最深的葉子節點,那麼第二次dfs必然找到另外一...

兩次bfs求樹的直徑的正確性

update on 2020.6.3 忘了以前寫的部落格是怎麼樣的了,也不想校對,趁著整理普及圖論就重新寫了點。目錄樹的直徑 可以樹形dp求,也可以兩次dfs。dfs方法好像得出方案更容易。這裡給出dfs方法。dfs 求樹直徑的兩端點 正確性?如果 u 確實是某條直徑上的端點,那麼 v 就一定是另乙...

演算法導論 22 2 7 樹的直徑

22.2 7 很顯然數的直徑就是樹的最長簡單路。先進行一次bfs 然後再從 bfs的終點再進行一次 bfs得到的最長路徑就是直徑。進行了兩次 bfs,所以複雜度還 o e v 參考自 樹的直徑是指樹的最長簡單路。求法 兩遍bfs 先任選乙個起點bfs找到最長路的終點,再從終點進行bfs,則第二次bf...