顶点为:A,B,C,D,E,F;
图请见:数据结构(严蔚敏版)
#include <stdio.h>
#define M 999 //M代表不可达
#define N 6
kruskal(){
//初始化数据
int edge[N][N]={{M,6,1,5,M,M},{6,M,5,M,3,M},
{1,5,M,5,6,4},{5,M,5,M,M,2},{M,3,6,M,M,6},{M,M,4,2,6,M}};
//初始状态TE={V,{ }};设置顶点所在的连通分量,边不在TE中
int vflag[N]={1,2,3,4,5,6};
int eflag[N][N]={0};
int i,j;
int count = 0;
//从图中选取出N-1条边
while(count<N-1){
int min = 999;
int m,n,index;
m=-1;
n=-1;
index=-1;
//从所有边中选取当前最短的边(u,v)
for(i=0;i<N;i++)
for(j=i+1;j<N;j++){
if(edge[i][j]!=M&&eflag[i][j]!=1){
if(edge[i][j]<min){
min = edge[i][j];
m=i;
n=j;
}
}
}
printf("最小值为:%d\n",min);//打印出从E边中找出的最短边
eflag[m][n]=1;
//判断(u,v)是不是属于同一个连通分量,如果不是则加入TE中,如果是,则不加入。
if(vflag[m]!=vflag[n]){
printf("将第%d条边加入T中,长度为:%d:%c->%c\n",(count+1),edge[m][n],(m+65),(n+65));
count++;
}
//修改连通分量
for(i=0;i<N;i++){
//合并点m所在连通分量和点n所在的连通分量
if(vflag[i]==vflag[m]||vflag[i]==vflag[n]){
vflag[i]=vflag[m];
}
}
}
}
int main(){
kruskal();
return 1;
}