#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int fromvex, endvex; //边的起点和终点,用整数表示
float length; //边的权值
int sign; //该边是否已选择过的标志信息
} edge; //存储边的信息
void kruskal(int n, int e, edge* T, int* G); //kruskal算法
int main(void)
{
int n, e, i;
printf("输入图的顶点数和边数:");
scanf("%d%d", &n, &e);
edge* T = (edge*)malloc(sizeof(edge) * e); //创立边数组
int* G = (int*)malloc(sizeof(int) * n); //创立顶点数组,默认编号为整型
kruskal(n, e, T, G);
printf("最小生成树的边为:\n");
for (i = 0; i < e; i++)
if (T[i].sign == 1)
printf("<%d,%d,%g>\n", T[i].fromvex, T[i].endvex, T[i].length);
return 0;
}
void kruskal(int n, int e, edge* T, int* G)
{
int i, k, l, t, temp, j = 0;
float min; //比较初始值
for (i = 0; i < n; i++)
G[i] = i;
for (i = 0; i < e; i++) {
printf("输入第%d边的起点终点和权值:", i + 1);
scanf("%d%d%f", &T[i].fromvex, &T[i].endvex, &T[i].length);
T[i].sign = 0;
}
while (j < n - 1) { //n个顶点,当加入n-1条边则寻找完毕,退出
min = 10000.0;
for (i = 0; i < e; i++) //寻找最短边
if (T[i].sign == 0 && T[i].length < min) {
k = T[i].fromvex;
l = T[i].endvex;
min = T[i].length;
temp = i;
}
if (G[k] == G[l]) //若该最短边在在同一连通分量中则标记为2,舍弃
T[temp].sign = 2;
else {
T[temp].sign = 1; //标记最短边为1
j++;
temp = G[l];
for (t = 0; t < n; t++) //将最短边的顶点标记为相同数字
if (G[t] == temp)
G[t] = G[k];
}
}
}
运行结果