1. 程式人生 > >關於最小生成樹演算法原理的一點思考

關於最小生成樹演算法原理的一點思考

學最小生成樹的時候一直有很多疑問:
比如克魯斯卡爾演算法:為啥不能有迴路?為啥從最小的邊開始找?
比如普利姆演算法:隨意選起點不會影響結果麼?起點選的那條最短邊就一定是最小樹上的?

一、克魯斯卡爾演算法思考


1. 為啥不能有迴路?

  • 原因1:如果有迴路那邊就是N條了,而不是N-1了,那為啥是N-1呢?因為一個邊能連兩個定點,N個定點不留孤島肯定是N-1條邊連起來;
  • 原因2:假設迴路構成的路徑總和最短,那我們去掉迴路中一條最長的,那剩下的是不更短?而且其餘頂點還保持連通?所以有迴路一定不是最短;

2. 為啥從最小的邊開始找?

因為克魯斯卡爾就是以邊為核心,目的就是從小到大選N-1條最短的邊,這樣構成的路徑肯定也是最短的(當然構成迴路的邊不能去選);

二、普利姆演算法思考

1. 隨意選擇起點會影響結果麼?

選擇起點時,我們假設其餘的定點都已經連通了(因為他們遲早要連通的),那我們現在隨意算的起點,再選一個最短路徑是不就已經是整個圖的最優選擇了呢?

2. 起點選的那條最短邊就一定是最小樹上的?

同上

三、概念回顧


1. 樹(Tree)

如果一個無向連通圖中不存在迴路,則這種圖稱為樹。

2. 生成樹 (Spanning Tree)

無向連通圖G的一個子圖如果是一顆包含G的所有頂點的樹,則該子圖稱為G的生成樹。
生成樹是連通圖的極小連通子圖。這裡所謂極小是指:若在樹中任意增加一條邊,則將出現一條迴路;若去掉一條邊,將會使之變成非連通圖。

3. 最小生成樹(Minimum Spanning Tree,MST)

或者稱為最小代價樹Minimum-cost Spanning Tree:對無向連通圖的生成樹,各邊的權值總和稱為生成樹的權,權最小的生成樹稱為最小生成樹。

構成生成樹的準則有三條:
<1> 必須只使用該網路中的邊來構造最小生成樹。
<2> 必須使用且僅使用n-1條邊來連線網路中的n個頂點
<3> 不能使用產生迴路的邊。

構造最小生成樹的演算法主要有:克魯斯卡爾(Kruskal)演算法和普利姆(Prim)演算法他們都遵循以上準則。

4. 克魯斯卡爾(Kruskal)演算法

根據邊的加權值以遞增的方式,一次找出加權值最低的邊來構建最小生成樹,而且規定:每次新增的邊不能造成生成樹有迴路,知道找到N-1個邊為止。

5. 普利姆(Prims)演算法

以每次加入一個的臨界邊來建立最小生成樹,直到找到N-1個邊為止。其規則為:以開始時生成樹的集合(集合U)為起始的定點,然後找出與生成樹集合鄰接的邊(集合V)中,加權值最小的邊來建立生成樹,為了確定新加入的邊不會造成迴路,所以每一個新加入的邊,只允許有一個頂點在生成樹集合中,重複執行此步驟,直到找到N-1個邊為止。