【問題描述】
已知含有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.那麼我們需要等價類的概念...