算法 - 最小生成樹

什麼是最小生成樹

​ 一個有 n 個結點的連通圖的生成樹是原圖的極小連通子圖,且包含原圖中的全部 n 個結點,而且有保持圖連通的最少的邊。最小生成樹能夠用kruskal(克魯斯卡爾)算法或prim(普里姆)算法求出。算法

最小權重生成樹又是什麼

​ 在一給定的無向圖G = (V, E) 中,(u, v) 表明鏈接頂點 u 與頂點 v 的邊(即),而 w(u, v) 表明此的權重,若存在 T 爲 E 的子集(即)且爲無循環圖,使得ide

的 w(T) 最小,則此 T 爲 G 的最小生成樹視頻

img

最小生成樹實際上是最小權重生成樹的簡稱。對象

實際應用場景

img

例如:要在n個城市之間鋪設光纜,主要目標是要使這 n 個城市的任意兩個之間均可以通訊,但鋪設光纜的費用很高,且各個城市之間鋪設光纜的費用不一樣,所以另外一個目標是要使鋪設光纜的總費用最低。這就須要找到帶權的最小生成樹。blog

算法實現

咱們首先看咱們的無向圖 , 須要找到一個最小權重生成樹排序

kruskal 算法

其基本思想就是把每條邊都拿出來, 而後按照權重排序, 將這些邊組合起來, 要求的是組合過程當中不能夠造成環, 造成環則放棄這條邊get

基本實現就是這個了, 打錯的是不符合要求的. 到最後就會造成最小權重生成樹it

Prim 算法

其基本思想就比較麻煩, 咱們先看一張圖class

這裏有四行數據,循環

第一行各個節點.

第二行是節點是否被選中

第三行是節點與父親節點之間的距離(權重) , 好比 a-b ,若是a被選了,那麼 b的父親就是a,就是這個意思,ab之間的權重就是這個值, 並且b不必定只有一個父親

第四行就是父親節點是誰了

因此開始吧

咱們首先以0位起始位置 , 0標記爲true, 開始往前推動, 0和1,7連着. 0-7=8,0-1=4 , 因此這一次選0-1 , 此時 標記1爲true ,

01節點連着的有 0-7=8,1-7=11,1-2=8 ,此時0-7與1-2相同, 此時選擇父節點小的爲選擇對象 , 此時將7標記爲true.

071 節點連着 1-2=8 , 7-6=1 , 7-8=7 , 因此選擇 7-6 ,標記6爲true , 就一直標記到所有爲true爲止.

這個思路就是我上述講的.

若是你仍是不理解能夠看看這個視頻 , 連接 : https://www.bilibili.com/video/av47042691?from=search&seid=15424121794388295524

相關文章
相關標籤/搜索