鄰接表儲存 Kruskal最小生成樹演算法

2021-09-27 09:14:19 字數 2089 閱讀 5487

注意:

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 這條邊連線...