注意:
1、鄰接表中以邊為堆的構建用edge型別的eset陣列儲存,無向圖儲存邊時只儲存一次,即要保證v < w->adj,有向圖即儲存兩邊。
2、儲存完成後將當前邊集合通過perdown操作調整為最小堆;
3、以及在kruskal演算法中每次獲取堆頂最小元素時的函式,getminedge操作時,先將堆頂最小元素與最後乙個元素交換,再將從堆頂為根的堆除了最後乙個最小元素進行perdown操作,調整為最小堆,返回當前最後乙個元素的下標。
4、關於檢查選的邊是否會使mst成環,用並查集來做,並查集的查與並(路徑壓縮)(遞迴及非遞迴)
5、最小生成樹:邊數要等於頂點數-1
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
#define max 1010
using namespace std;
int s[max]
;int dist[max]
;int parent[max]
;//儲存當前節點的父節點
typedef
struct enode
*edge;
struct adjnode
;typedef
struct vnode
*adjlist[max]
;//鄰接表
typedef
struct lgnode
*lgraph;
//圖初始化
lgraph initlgraph
(int vertexnum)
//圖中邊的插入
void
insertedge
(lgraph g, edge e)
lgraph creatlgraph
(int vertex)
/*-------------------- 並查集定義開始 --------------------*/
void
initset()
intfindset
(int x)
return s[x];}
void
unionset
(int root1,
int root2)
else
}bool checkcircle
(int x,
int y)
}/*-------------------- 並查集定義結束 --------------------*/
/*-------------------- 邊的最小堆定義 --------------------*/
//邊儲存到edge型別的陣列從0開始儲存,進行perdown操作按weight使其變為最小堆,n為邊數
void
perdown
(edge *eset,
int p,
int n)
}//將鄰接表的邊儲存入edge的陣列
void
initedgeset
(lgraph g, edge *eset)}}
//將邊陣列進行調整使其變為最小堆
for(
int i = g->edgenum /
2; i >=
0; i--)}
//從最小堆取得最小邊,currentsize當前堆的大小,從0開始,最後乙個為currentsize-1
intgetminedge
(edge *eset,
int currentsize)
/*-------------------- 最小堆定義結束 --------------------*/
intkruskal
(lgraph g, lgraph mst)
}//若已收錄邊小於頂點數-1,即最小生成樹不存在,標記為-1
if(edgenum < g->vertex_num -
1) totalweight =-1
;return totalweight;
}int
main()
kruskal 最小生成樹
include include 產生隨機數組用 include 同上 include using namespace std 1 帶權邊的類myarc class myarc bool operator const myarc arc myarc myarc int beginvex,int end...
最小生成樹Kruskal
最小生成樹有兩個特點,乙個是保證了所有邊的和是最小值,另乙個是保證了所有邊中的最大值最小。struct edge bool friend operator edge a,edge b 構邊 vectoredge int id max int mini void initial void input ...
最小生成樹(kruskal)
kruskal演算法 1 記graph中有v個頂點,e個邊 2 新建圖graphnew,graphnew中擁有原圖中相同的e個頂點,但沒有邊 3 將原圖graph中所有e個邊按權值從小到大排序 4 迴圈 從權值最小的邊開始遍歷每條邊 直至圖graph中所有的節點都在同乙個連通分量中 if 這條邊連線...