update on 2020.6.3
忘了以前寫的部落格是怎麼樣的了, 也不想校對, 趁著整理普及圖論就重新寫了點。
目錄樹的直徑
可以樹形dp求, 也可以兩次dfs。
dfs方法好像得出方案更容易。
這裡給出dfs方法。
dfs 求樹直徑的兩端點
正確性?
如果 \(u\) 確實是某條直徑上的端點, 那麼 \(v\) 就一定是另乙個端點。
為什麼 \(u\) 一定是某條直徑的乙個端點呢? 明明 \(s\) 是隨便選的啊!
可以這樣想:假定直徑的兩個端點分別為 \(u、v\), 不管 \(s\) 在不在直徑上, 只要存在任意一點 \(t\) 距離 \(s\) 最遠(大於 \(s\) 到 \(u\) 的距離 和 \(s\) 到 \(v\) 的距離), 那麼就可以推出
路徑 \(u \rightarrow v\) 不是直徑。
結論:離樹上任意點\(u\)最遠的點一定是這顆樹直徑的乙個端點。
證明:若點 \(u\) 在樹的直徑上,設它與直徑兩個端點 \(x,y\) 的距離分別為 \(s1\)、\(s2\),若距離其最遠的點 \(v\) 不是這兩個端點,
則 \(dist(u,v) > s1\) 且 \(dist(u,v) > s2\), 則必有 \(s1 + dist(u,v) > s1 + s2\) 或 \(s2 + dist(u,v) > s1 + s2\),這與 \((x,y)\) 是直徑的
假設相悖。
反之 \(u\) 不在樹的直徑上,則其到直徑最近的一點 \(mid\) 的距離為 \(dist(u,mid)\),設直徑的兩端點分別為 \(x,y\)。
若距離 \(u\) 最遠的點不是 \(x,y\) 之一, 設距離 \(u\) 最遠的點為 \(v\),
則路徑 \(u->v\) 會出現如下幾種情況:
1.完全經過路徑 \(u->mid\)
2.完全不經過路徑 \(u->mid\)
3.不完全經過路徑 \(u->mid\)
這3種情況都能推出 \((x,y)\) 不是樹的直徑的結論。
故結論正確。
兩次BFS求樹的直徑 演算法導論22 2 7
以任意點w開始,先做一次bfs,找到最遠的點v,然後再以此點v進行一次bfs,找到最遠的點為u,u到v就是樹的直徑。此問題的關鍵不是在程式設計,而是要證明,網上也找了很多資料,沒有看到證明,以下是個人的證明方法。首先要知道樹是沒有環路的連通圖,任意兩點都有一條通路,而且也只有一條通路。同時假設樹的一...
樹的直徑 兩次dfs求樹的直徑
樹的直徑是一棵樹的某兩個最深的葉子節點的連線,多用於與圖論演算法巢狀考 1 很簡單的演算法,不會單獨考,學習和熟練使用它的多種情況 很簡單,兩次dfs 至於為什麼,可以畫圖模擬一下,因為一次dfs必然會在一棵子樹或者根節點上,每次dfs必然找到一棵子樹的最深的葉子節點,那麼第二次dfs必然找到另外一...
樹的直徑(兩個bfs)
樹的直徑 樹中的最長鏈 具體思路 隨便找乙個點bfs,然後找到最長的鏈,然後再以找到的點作為起點進行bfs,然後找到的最長的鏈就是樹的直徑。ac include include include include include include include include include inclu...