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 若...