樹的直徑是一棵樹的某兩個最深的葉子節點的連線,多用於與圖論演算法巢狀考
1、很簡單的演算法,不會單獨考,學習和熟練使用它的多種情況
很簡單,兩次dfs
至於為什麼,可以畫圖模擬一下,因為一次dfs必然會在一棵子樹或者根節點上,每次dfs必然找到一棵子樹的最深的葉子節點,那麼第二次dfs必然找到另外一棵子樹的葉子節點,這兩點的唯一路徑就是整棵樹的直徑。由這個定理我們又可以得到,樹的直徑不止一條。
**如下(參考pt07z - longest path in a tree)
//#define fre yes
#include #include const int n = 10005;
int head[n << 1], to[n << 1], ver[n << 1];
int d[n];
bool vis[n];
int tot;
void addedge(int x, int y)
void dfs(int u)
}}int diameter(int n)
}memset(d, 0, sizeof(d));
memset(vis, false, sizeof(vis));
dfs(st);
mx = -1e9;
for (int i = 1; i <= n; i++)
} return mx;
}int main()
printf("%d\n",diameter(n));
return 0;
}
那麼也就會存在另乙個問題,讓你輸出你找的兩個節點的最短路徑
挺智障的問題,可以在更新完後得到兩個節點來搞,也可以在更新時來搞 前者時間消耗多一點,後者空間消耗多一下 看自己喜好 這裡就不放**了
兩次BFS求樹的直徑 演算法導論22 2 7
以任意點w開始,先做一次bfs,找到最遠的點v,然後再以此點v進行一次bfs,找到最遠的點為u,u到v就是樹的直徑。此問題的關鍵不是在程式設計,而是要證明,網上也找了很多資料,沒有看到證明,以下是個人的證明方法。首先要知道樹是沒有環路的連通圖,任意兩點都有一條通路,而且也只有一條通路。同時假設樹的一...
兩次bfs求樹的直徑的正確性
update on 2020.6.3 忘了以前寫的部落格是怎麼樣的了,也不想校對,趁著整理普及圖論就重新寫了點。目錄樹的直徑 可以樹形dp求,也可以兩次dfs。dfs方法好像得出方案更容易。這裡給出dfs方法。dfs 求樹直徑的兩端點 正確性?如果 u 確實是某條直徑上的端點,那麼 v 就一定是另乙...
求樹的直徑
歡迎來踩本人部落格 樹的直徑 就是樹上最長路 方法 求兩邊dfs即可 步驟 1.從任意一點進行dfs,然後找到乙個最長路徑,記錄最遠點u 2.然後從u再進行dfs,找最長路徑,記錄一點v。u,v 就是樹的直徑 第四屆藍橋杯a組 證明 我們可以看出圖中,樹的直徑是 4 2 5 長度為9.我們一開始選定...