试实现克鲁斯卡尔最小生成树算法。
函数接口定义:
void Kruskal(AMGraph G);
其中 G
是基于邻接矩阵存储表示的无向图。
裁判测试程序样例:
#include <stdio.h>
#define MVNum 10
#define MaxInt 32767
typedef struct{
char vexs[MVNum];
int arcs[MVNum][MVNum];
int vexnum,arcnum;
}AMGraph;
struct Evode{
char Head;
char Tail;
int lowcost;
}Edge[(MVNum * (MVNum - 1)) / 2];
int Vexset[MVNum];
void CreateUDN(AMGraph &G);//实现细节隐藏
void Kruskal(AMGraph G);
int main(){
AMGraph G;
CreateUDN(G);
Kruskal(G);
return 0;
}
/* 请在这里填写答案 */
输入样例:
第1行输入结点数vexnum和边数arcnum。第2行输入vexnum个字符表示结点的值,接下来依次输入arcnum行,每行输入3个值,前两个字符表示结点,后一个数表示两个结点之间边的权值。
7 9
0123456
0 1 28
0 5 10
1 2 16
1 6 14
2 3 12
3 6 18
3 4 22
4 5 25
4 6 24
输出样例:
按最小生成树的生成顺序输出每条边。
0->5
2->3
1->6
1->2
3->4
4->5
函数代码入下:
void Kruskal(AMGraph G){
int i, j, k, n = 0, m = 0;
for (i = 0; i < G.vexnum; i++) {
for (j = i + 1; j < G.vexnum; j++) {
if (G.arcs[i][j] != 0 && G.arcs[i][j] != MaxInt) {
Edge[m].Head = G.vexs[i];
Edge[m].Tail = G.vexs[j];
Edge[m].lowcost = G.arcs[i][j];
m++;
}
}
}
for (i = 0; i < m - 1; i++) {
for (j = 0; j < m - i - 1; j++) {
if (Edge[j].lowcost > Edge[j + 1].lowcost) {
struct Evode temp = Edge[j];
Edge[j] = Edge[j + 1];
Edge[j + 1] = temp;
}
}
}
for (i = 0; i < G.vexnum; i++) {
Vexset[i] = i;
}
for (i = 0; i < m; i++) {
int h = Edge[i].Head - '0';
int t = Edge[i].Tail - '0';
int head = Vexset[h];
int tail = Vexset[t];
if (head != tail) {
printf("%c->%c\n", Edge[i].Head, Edge[i].Tail);
for (j = 0; j < G.vexnum; j++) {
if (Vexset[j] == tail) {
Vexset[j] = head;
}
}
}
}
}