kruskal (克魯斯卡爾)演算法與前面的prim(普里姆)演算法都是求最小生成樹的演算法,prim 在沒有任何優化的情況下時間複雜度為o(n^2) kruskal 的時間複雜度與使用的排序演算法有關 若用快排(qsort) 時間複雜度為 o(n log n) ;兩者還有乙個區別:prim
演算法以點為單位採用迭代的思想逐步生成最小樹,kruskal 演算法以邊為單位借助並查集的思想和操作 生成最小樹
簡單介紹一下kruskal演算法:首先將所有的邊進行一遍排序 (遞增順序)然後從最小的一條邊開始 ,若將此邊加入到最小生成樹的集合中不會產生迴路就將其新增進去直到 存入了 n-1 條邊結束。
特別需要注意的是最後要判斷一下並查集有幾個連通集若大於一則說明沒有最小生成樹
實現**:
//kruskal 演算法
#include#include#include#define maxn 100
typedef structedge;
int pre[maxn]; //並查集
int find(int a) //這是並查集查詢祖先的函式
void join(int a,int b)
void init() //初始化並查集
void kruskal (int n,int m)
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 這條邊連線...