最小生成樹算法

最小生成樹算法有:Kruskal 算法和 Prim 算法。

首先明確關(guān)于圖的幾個(gè)概念:

  • 連通圖:在無(wú)向圖中,若任意兩個(gè)頂點(diǎn) vi 與 vj 都有路徑相通,則稱該無(wú)向圖為連通圖。
  • 強(qiáng)連通圖:在有向圖中,若任意兩個(gè)頂點(diǎn) vi 與 vj 都有路徑相通,則稱該有向圖為強(qiáng)連通圖。
  • 連通網(wǎng):在連通圖中,若圖的邊具有一定的意義,每一條邊都對(duì)應(yīng)著一個(gè)數(shù),稱為權(quán);權(quán)代表著連接兩個(gè)頂點(diǎn)的代價(jià),稱這種連通圖叫做連通網(wǎng)。
  • 生成樹:一個(gè)連通圖的生成樹是指一個(gè)連通子圖,它含有圖中全部 n 個(gè)頂點(diǎn),但只有足以構(gòu)成一棵樹的 n-1 條邊。(一顆有 n 個(gè)頂點(diǎn)的生成樹有且僅有 n-1 條邊,如果生成樹中再添加一條邊,則必定成環(huán)。)
  • 最小生成樹:在連通網(wǎng)的所有生成樹中,所有邊的代價(jià)和最小的生成樹,稱為最小生成樹。

Kruskal 算法

也可以稱為加邊法,初始最小生成樹邊數(shù)為 0,每迭代一次就選擇一條滿足條件的最小代價(jià)邊,加入到最小生成樹的邊集合里:

  1. 把圖中的所有邊按代價(jià)從小到大排序;
  2. 把 n 個(gè)頂點(diǎn)的圖看成獨(dú)立的 n 棵樹組成的森林;
  3. 按權(quán)值從小到大選擇邊,所選的邊連接的兩個(gè)頂點(diǎn) ui、vi 應(yīng)屬于兩顆不同的樹,則成為最小生成樹的一條邊,并將這兩顆樹合并作為一顆樹。
  4. 重復(fù)步驟 3,直到所有頂點(diǎn)都在一顆樹內(nèi)或者有 n-1 條邊為止。
Kruskal 算法

時(shí)間復(fù)雜度(邊數(shù) e):O(e*log2e)

Prim 算法

也可以稱為加點(diǎn)法,每次迭代選擇代價(jià)最小的邊對(duì)應(yīng)的點(diǎn),加入到最小生成樹中。算法從某一個(gè)頂點(diǎn) s 開始,逐漸長(zhǎng)大覆蓋整個(gè)連通網(wǎng)的所有頂點(diǎn)。

  1. 圖的所有頂點(diǎn)集合為 V;初始令集合 u = {s}, v = V?u;
  2. 在兩個(gè)集合 u、v 能夠組成的邊中,選擇一條代價(jià)最小的邊 (u0, v0),加入到最小生成樹中,并把 v0 并入到集合 u 中。
  3. 重復(fù)上述步驟,直到最小生成樹有 n-1 條邊或者 n 個(gè)頂點(diǎn)為止。
Prim 算法

由于不斷向集合 u 中加點(diǎn),所以最小代價(jià)邊必須同步更新;需要建立一個(gè)輔助數(shù)組 edge[],用來(lái)維護(hù)集合 v 中每個(gè)頂點(diǎn)與集合 u 中最小代價(jià)邊信息。每次 u 新加入一個(gè)點(diǎn)后,掃描它能到的點(diǎn),假設(shè)它到某個(gè)點(diǎn) i 的代價(jià)更小,就替換掉原先的 edge[i] 的代價(jià)值。

時(shí)間復(fù)雜度(節(jié)點(diǎn)數(shù) v,邊數(shù) e):
鄰接矩陣 O(v2)
鄰接表 O(e*log2v)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、定義 最小生成樹(Minimum Spanning Tree,MST)僅針對(duì)加權(quán)連通無(wú)向圖。對(duì)于一副加權(quán)連通無(wú)...
    null12閱讀 2,548評(píng)論 0 0
  • 定義 關(guān)于最小生成樹的定義,需要先了解如下這幾個(gè)相關(guān)概念: 連通圖:在無(wú)向圖中,若任意兩個(gè)頂點(diǎn)vi與vj都有路徑相...
    JarryWell閱讀 4,183評(píng)論 0 4
  • 第一章 緒論 什么是數(shù)據(jù)結(jié)構(gòu)? 數(shù)據(jù)結(jié)構(gòu)的定義:數(shù)據(jù)結(jié)構(gòu)是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。 第二章...
    SeanCheney閱讀 5,986評(píng)論 0 19
  • https://zh.visualgo.net/graphds 淺談圖形結(jié)構(gòu)https://zh.visualgo...
    狼之獨(dú)步閱讀 4,412評(píng)論 0 0
  • f#投影空間和屏幕空間先不說(shuō)UI,如果是一個(gè)普通渲染流程,一個(gè)Cube普通地被渲染。 如果屏幕在現(xiàn)實(shí)中變小了,這個(gè)...
    DonaldW閱讀 26,876評(píng)論 3 31

友情鏈接更多精彩內(nèi)容