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的生成樹,而各邊權和最小的生成樹則被稱...