Kruskal演算法的C語言實現(並查集版)

2021-06-22 00:37:37 字數 1237 閱讀 3858

【問題】

kruskal演算法求加權連通圖的最小生成樹的演算法。kruskal演算法總共選擇n- 1條邊,所使用的貪婪準則是:從剩下的邊中選擇一條不會產生環路的具有最小耗費的邊加入已選擇的邊的集合中。注意到所選取的邊若產生環路則不可能形成一棵生成樹。kruskal演算法分e 步,其中e 是網路中邊的數目。按耗費遞增的順序來考慮這e 條邊,每次考慮一條邊。當考慮某條邊時,若將其加入到已選邊的集合中會出現環路,則將其拋棄,否則,將它選入。

【**】

#include #include #define max 20

typedef char vertextype;

typedef struct edge

edge;

typedef struct

adjmatrix[max][max];

typedef struct

mgraph;

void creategraph(mgraph &g, edge *edges);

int locadvex(mgraph g, vertextype v);

int find(int *parent, int p);

void unionfind(int *parent, int *rank, int p, int q);

void sort(edge *edges, int n);

void kruskal(mgraph g, edge *edges);

int locadvex(mgraph g, vertextype v)

void creategraph(mgraph &g, edge *edges)

//輸入邊和權值

for(i = 1; i <= g.arcnum; i++)

}void sort(edge *edges, int n)

}int find(int *parent, int p)

return p;

}void unionfind(int *parent, int *rank, int p, int q)

else }

void kruskal(mgraph g, edge *edges)

//邊權重排序

sort(edges, g.arcnum);

for(i = 1; i <= g.arcnum; i++) }

}int main(int argc, char const *argv)

最小生成樹 kruskal演算法C語言實現

系列文章 最小生成樹 prim演算法c語言實現 時間複雜度 o nlogn n為邊數 kruskal演算法又稱 加邊法 用於邊數較少的稀疏圖 方法 每次找圖中權值最小的邊 此演算法中對於權值的排序運用了快速排序的方法 將邊連線的兩個頂點加入最小生成樹集合中 注意 相同權值任選其中乙個即可,但是不允許...

c語言實現磁碟排程演算法 C語言實現洗牌演算法

首先看一道題目 有乙個大小為100的陣列,裡面的元素是從 1 到 100,隨機從陣列中選擇50個不重複數。用math.random 100,就可以拿到乙個 0 到 99 的隨機數,是不是重複50次就可以了?當然不是,假如,第一次隨機到5,第二次如果再一次隨機到5的話,要求是選擇不重複的數,所以要選出...

kruskal演算法(C 實現)

templatebool kruskal edgenodet next i,j,c 把邊放到最小堆 minheap h 1 h.initialize e,e,e unionfind u n k 0 while e k n 1 deactivatepos h.deactivate return k n...