不相交集應用 kruskal演算法

2021-09-29 17:15:42 字數 964 閱讀 8976

【問題描述】

已知含有n個頂點的帶權連通無向圖,採用鄰接矩陣儲存,鄰接矩陣以三元組的形式給出,只給出不包括主對角線元素在內的下三角形部分的元素,且不包括不相鄰的頂點對。分別採用prim演算法和kruskal演算法,求該連通圖的最小生成樹的權值之和。

【輸入形式】

第一行給出結點個數n和三元組的個數count,以下每行給出乙個三元組,數之間用空格隔開。(注意這裡頂點的序號是從1到n,而不是0到n-1,程式裡要小心!)

【輸出形式】

兩種演算法求解的最小生成樹的權值之和

【樣例輸入】

5 82 1 7

3 1 6

3 2 8

4 1 9

4 2 4

4 3 6

5 2 4

5 4 2

【樣例輸出】

//kruskal 演算法 

typedef struct

edge;

edge edge[max_vertex_num];

void sort(graph &g) //找出最小權值

}int p[max_vertex_num];//定義點的集合

int rank[max_vertex_num];

int find(int x)//查詢集合i(乙個元素是乙個集合)的源頭(遞迴實現)

int root=y;

y=x;

while(p[y]!=y)

return root;

}void union(int x,int y)//加入團體

}int minispantree_kruskal(graph &g)

for(i=0;i}

} sort(g);//邊的權值排序

k=0;

for(i=0;i}

return sum;}

int main()

不相交集及應用

乙個集合s,集合中乙個元素a。a的等價類是s的乙個子集,該子集包含所有與a有關係的元素。等價類形成是對s的乙個劃分且s中的每乙個成員恰好出現在乙個等價類中。這樣,判斷a與b是否有關係,只需要判斷a與b是否在乙個等價類中即可。對於集合s劃分,取任意兩個等價類,si與sj,如果si sj 則稱這些集合不...

不相交集ADT

1.不相交集是解決等價關係的一種資料結構,執行合併和查詢的速度都非常快,m次執行合併和查詢的執行時間為 m logn 在乙個集合中,對於每一對元素 a,b a,b s,對於關係r如果滿足下面三個條件,則成關係r為等價關係 1 自反性 對於所有a s,ara 2 對稱性 arb當且僅當bra 3 傳遞...

不相交集ADT

首先我們必須明白不相交集這種資料結構是用來幹什麼的。不相交即主要用來實現動態等價問題的求解。動態 等價問題 這裡不再說明等價關係的概念,這個可以參考數理邏輯之類的書。假設我們有乙個集合和乙個等價關係 針對集合中的任意兩個元素 a 和 b,我們如何確定他們有等價關係 即a b.那麼我們需要等價類的概念...