次小生成樹演算法與證明
題目
考慮一張無向的加權圖
演算法
- 先找出
的最小生成樹 - 設
- 對於所有的邊
- 找到
中,點 到點 的路徑上,邊長最長的邊 - 將
加入至集合 中
- 找到
中權重和最小的樹即為所求
證明
先考慮一個樸素作法,因為次小生成樹與最小生成樹至少有一條邊不一樣,因此,可以枚舉最小生成樹的邊,將其刪除之後,再求最小生成樹,那次小生成樹必然會是這
接下來,可以證明刪掉一條邊的圖,存在一個最小生成樹,與原來的最小生成樹只有一條相異的邊。考慮 Kruskal 演算法,如果把第
為什麼會是最小生成樹呢?因為
- 如果
的兩端點不連接 的連通塊的話,那這條邊的決策就不被影響 - 如果
的兩端點連接 的連通塊的話,那這條邊就是比 更小連接方法,那與 的定義矛盾,因此不存在這種情形。
因此這個方法會是 Kruskal 的決策過程,故作出來的樹是最小生成樹。因此就可以推出存在一的次小生成樹,是與其最小生成樹相差一條邊的樹。
時間複雜度
- 步驟 1 若使用 Kruskal’s algorithm,複雜度為
- 步驟 3.1 若使用 最近公共祖先 (Lowest Common Ancestor, LCA) 的倍增法,單次可以在
的時間求出 - 集合
實作上,只需要紀錄加入及刪除哪一條邊即可,都可以在 時間完成
故可以在
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 LFsWang's World!