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

2021-06-05 03:41:48 字數 1311 閱讀 1997

22.2-7

很顯然數的直徑就是樹的最長簡單路。

先進行一次bfs

,然後再從

bfs的終點再進行一次

bfs得到的最長路徑就是直徑。進行了兩次

bfs,所以複雜度還

o(e+v)。

參考自:

樹的直徑是指樹的最長簡單路。求法: 兩遍bfs :先任選乙個起點bfs找到最長路的終點,再從終點進行bfs,則第二次bfs找到的最長路即為樹的直徑;

原理: 設起點為u,第一次bfs找到的終點v一定是樹的直徑的乙個端點

證明: 1) 如果u 是直徑上的點,則v顯然是直徑的終點(因為如果v不是的話,則必定存在另乙個點w使得u到w的距離更長,則於bfs找到了v矛盾)

2) 如果u不是直徑上的點,則u到v必然於樹的直徑相交(反證),那麼交點到v 必然就是直徑的後半段了

所以v一定是直徑的乙個端點,所以從v進行bfs得到的一定是直徑長度

#include

1. #include

2. #define inf 999999  

3. #define m 2002  

4. using namespace std;  

5. int n;  

6. int maxx;  

7. int map[m][m],sum[m];  

8. bool flag[m];  

9. int bfs(int begin)  

23.                                  }  

24.                          }  

25.                          f.pop();  

26.             }  

27.             return key;  

28. }  

29. int main()  

30.   

42.                          sum[1]=0;  

43.                          key=bfs(1);  

44.                          sum[key]=0;  

45.                          key=bfs(key);  

46.                          printf("%d\n",maxx);  

47.              }  

48.     //system("pause");  

49. }  

演算法導論 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就是樹的直徑。此問題的關鍵不是在程式設計,而是要證明,網上也找了很多資料,沒有看到證明,以下是個人的證明方法。首先要知道樹是沒有環路的連通圖,任意兩點都有一條通路,而且也只有一條通路。同時假設樹的一...

演算法導論22 2 7

從任意起點開始,執行一次bfs,得到乙個最遠點d1,d1即為直徑的一點 再執行一次bfs,得到乙個最遠點d2,則d1 d2為樹的直徑 為什麼這樣是對的?1 證明d1是樹直徑的一點 a 若s在直徑d1,d2上,則最後乙個點必能搜到d1或d2 因為若搜到最後乙個點為v,則直徑為vd2,與題意不符 b 若...