最小生成樹(MST) Kruskal演算法

2021-09-10 16:02:51 字數 1010 閱讀 6787

kruskal演算法主要對邊進行貪心,經過變換還可以求最大生成樹,還可以記錄樹的具體路徑。

初始狀態時隱去圖中所有邊,這樣圖中每個頂點都自成乙個連通塊。

對所有邊權從小到大排序。

按邊權從小到大測試所有邊,如果當前測試邊所連線的兩個結點不在同乙個連通塊中,則把這條測試邊加入最小生成樹中(合併兩個連通塊);否則,將這條測試邊捨棄

執行步驟2,直至最小生成樹中的邊數等於 總結點數-1或是測試完所有邊

概況一下就是:每次選擇圖中最小邊權的邊,如果邊的兩個端點在不同的連通塊中,就把這條邊加入最小生成樹中。

kruskal()

}return sum;

}

關於判斷兩結點是否處於同一連通塊,可用並查集實現。

struct edge

e[maxm]

;//存放邊

int n, m, father[maxn]

;//n為結點數,m為邊數

bool

cmp(

const edge &a,

const edge &b)

void

init()

//並查集的初始化

intfindfather

(int x)

//查詢根

return root;

}int

kruskal

(int r)

}//注意:若cnt最終不等於n-1,說明存在無法連通的結點

return sum;

}

ps. 摘自《演算法筆記》

最小生成樹(MST) Kruskal演算法

kruskal演算法是在處理乙個森林 樹的集合。開始時將圖的每個頂點看做一棵樹 集合 然後採用貪婪策略,每次從所有邊中依次選出 find 權值最小的邊,當改邊的兩個端點不在同一集合時,則將終點所在集合與起點集合合併 union 直到依次處理完所有的邊,演算法終止,此時所有的頂點在乙個樹中,即為最小生...

最小生成樹(MST,kruskal演算法)

最小生成樹,對於乙個無向圖,聯通且不含圈的圖稱為樹。給定無向圖g v,e 連線g中所有點,且邊集是e的子集的數稱為g的生成樹 spanning tree 而權值最小的生成樹稱為最小生成樹 minimal spanning tree,mst 構造mst的演算法有很多,最常見的有兩個 kruskal演算...

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...