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

2022-07-16 14:00:13 字數 940 閱讀 7995

樹的直徑是一棵樹的某兩個最深的葉子節點的連線,多用於與圖論演算法巢狀考

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.我們一開始選定...