kruskal演算法是一種使用貪心思路求解無向圖的最小生成樹的演算法。
其大體思路為:將邊按權重排序,然後每次選出權最小且不使圖產生環的邊,作為樹的邊掛上樹。
具體來講就是這麼兩個步驟:
1.把邊按權重排序。
2.依照1的順序遍歷邊:
使用乙個並查集來判斷加進這條邊後圖中是否有環。
如果沒有環,更新並查集,並把此邊加入樹。
並查集判斷環的回顧:
使用乙個陣列儲存每個點的祖先節點。對於無向圖,可以直接按照點的數字大小作為代表元的依據,令值小的為代表元。
如果兩個點v,w,判斷加入新邊e=後是否會產生環的思路是:如果v,w加邊前的代表元相同,那麼就說明v,w間有路,加邊後就會成環。
變數使用: 使用edg記錄每個邊的資訊,fa為並查集,v,e代表圖的節點,邊數。
以hdu1301為例
#include using namespace std;
const int maxn=200;
struct ed
}sort(edg+1,edg+e);
}int kruskal()
}return su;
}int main()
{ while(cin>>v,v!=0)
{init();
cout<
Kruskal演算法求最小生成樹
include include define max vex 100 typedef struct edge edge edgeset max vex 邊集陣列 edgnum max vex 1 int creat return edgnum 排序,使邊集陣列edgeset元素按權值遞增順序排列 v...
kruskal演算法求最小生成樹
描述 要求對乙個圖使用kruskal演算法求最小生成樹,依次輸出選出的邊所關聯的頂點序列,要求下標較小者在前,如圖所示,其頂點序列為1 3 4 6 2 5 3 6 2 3 輸入若干行整數 第一行為兩個整數,分別為圖的頂點數和邊數 第二行開始是該圖的鄰接矩陣,主對角線統一用0表示,無直接路徑的兩點用1...
求最小生成樹 kruskal演算法
kruskal演算法 c 實現 輸入邊資訊 兩頂點及權重 按權重從小到大排序 找n 1條不構成迴路的最小邊 難點 判斷是否構成迴路 include using namespace std 邊結構體 typedef struct edge edge intmain 按照權重從小到大排序 for i 0...