本文是[数据结构基础系列(7):图]中第12课时[最小生成树的克鲁斯卡尔算法]的例程。
(程序中graph.h是图存储结构的“算法库”中的头文件,详情请单击链接…)
#include <stdio.h>
#include <malloc.h>
#include "graph.h"
#define MaxSize 100
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<g.n; 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()
{
MGraph g;
int A[6][6]=
{
{0,6,1,5,INF,INF},
{6,0,5,INF,3,INF},
{1,5,0,5,6,4},
{5,INF,5,0,INF,2},
{INF,3,6,INF,0,6},
{INF,INF,4,2,6,0}
};
ArrayToMat(A[0], 6, g);
printf("最小生成树构成:\n");
Kruskal(g);
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
附:测试用图结构
![这里写图片描述](https://img-blog.csdn.net/20151107103349402)