工程代码
#include <stdio.h>
#define MaxSize 20
#define INF 32767
#define MAXV 20
typedef char InfoType;
typedef struct
{
int no;
InfoType info;
} VertexType;
typedef struct
{
int edges[MAXV][MAXV];
int n, e;
VertexType vexs[MAXV];
} MGraph;
typedef struct
{
int u;
int v;
int w;
} Edge;
void InsertSort(Edge E[], int n)
{
int i, j;
Edge temp;
for (i = 1; i < n; i++) {
temp = E[i];
j = i - 1;
while (j >= 0 && temp.w < E[j].w) {
E[j + 1] = E[j];
j--;
}
E[j + 1] = temp;
}
}
void Kruskal(MGraph g)
{
int i, j, u1, v1, sn1, sn2, k;
int vset[MAXV];
Edge E[MaxSize];
k = 0;
for (i = 0; i < g.n; i++)
for (j = 0; j < i; j++)
if (g.edges[i][j] != 0 && g.edges[i][j] != INF) {
E[k].u = i;
E[k].v = j;
E[k].w = g.edges[i][j];
k++;
}
InsertSort(E, g.e);
for (i = 0; i < g.n; i++)
vset[i] = i;
k = 1;
j = 0;
while (k < g.n)
{
u1 = E[j].u;
v1 = E[j].v;
sn1 = vset[u1];
sn2 = vset[v1];
if (sn1 != sn2)
{
printf(" (%d,%d):%d\n", u1, v1, E[j].w);
k++;
for (i = 0; i < g.n; i++)
if (vset[i] == sn2)
vset[i] = sn1;
}
j++;
}
}
int main()
{
int i, j;
MGraph g;
g.n = 5;
g.e = 7;
int a[MAXV][MAXV] = {
{0, 1, INF, INF, 7},
{1, 0, 6, INF, 5},
{INF, 6, 0, 3, 4},
{INF, INF, 3, 0, 2},
{7, 5, 4, 2, 0}
};
for (i = 0; i < g.n; i++)
for (j = 0; j < g.n; j++)
g.edges[i][j] = a[i][j];
printf("最小生成树构成:\n");
Kruskal(g);
printf("\n");
}