算法的基本思想:
1、选定任一顶点为出发顶点;
2、用一个数组存储该顶点到其余顶点的边的权值;
3、开始遍历权值数组(不包括已遍历顶点),找出权值最小的顶点,记录下标并将其在权值数组中的位置清0(表示已遍历);
4、以步骤3得到的顶点为出发顶点,更新数组存储的到各顶点权值的最小值(不包括已遍历顶点)并记录相应出发顶点,重复3直到结束。
#include <stdio.h>
#define MAXInt 65535 //表示两顶点没有直接相连
typedef struct MGraph
{
int numVertexes;
int arc[9][9];
}MGraph;
void prim(MGraph G)
{
int vertexes[10]; //数组下标表示目的顶点,对应值表示出发顶点
int minweight[10]; //数组下标表示目的顶点,对应值表示出发顶点到目的顶点的边的权值
int i,j,k,min;
vertexes[0]=0;
minweight[0]=0;
for(i=1;i<G.numVertexes;++i) //初始化
{
minweight[i]=G.arc[0][i]; //用v0相连边的权填充
vertexes[i]=0; //出发顶点的值设为v0
}
for(i=1;i<G.numVertexes;++i)
{
min=MAXInt;
j=1;
k=0;
while(j<G.numVertexes)
{
if(minweight[j] != 0 && minweight[j]<min)
{ //找出本轮最小权边,记下目的顶点下标
min=minweight[j];
k=j;
}
++j;
}
printf("(%d,%d)",vertexes[k],k); //打印出本轮最小权边的路径
minweight[k]=0; //权值置0,表示此顶点已完成任务
for(j=1;j<G.numVertexes;++j)
{ //以上面最小权边所连目的顶点作为新一轮的出发顶点,更新出最小权值
//数组(更新要求是小于上一轮的对应权值)
if(minweight[j] !=0 &&G.arc[k][j]<minweight[j])
{
minweight[j]=G.arc[k][j]; //更新权值
vertexes[j]=k; //更新出发顶点的下标k
}
}
}
}
void main(void)
{
// int i,j;
MGraph G= //顶点数和权值表(行下标对应顶点到列下标对应顶点的权值)
{
/*.numVertexes=*/9, //结构体初始化搞半天原来是VC不支持C99标准
/*.arc[9][9]=*/{0,10,MAXInt,MAXInt,MAXInt,11,MAXInt,MAXInt,MAXInt,
10,0,18,MAXInt,MAXInt,MAXInt,16,MAXInt,12,
MAXInt,MAXInt,0,22,MAXInt,MAXInt,MAXInt,MAXInt,8,
MAXInt,MAXInt,22,0,20,MAXInt,MAXInt,16,21,
MAXInt,MAXInt,MAXInt,20,0,26,MAXInt,7,MAXInt,
11,MAXInt,MAXInt,MAXInt,26,0,17,MAXInt,MAXInt,
MAXInt,16,MAXInt,MAXInt,MAXInt,17,0,19,MAXInt,
MAXInt,MAXInt,MAXInt,16,7,MAXInt,19,0,MAXInt,
MAXInt,12,8,21,MAXInt,MAXInt,MAXInt,MAXInt,0,},
};
/*printf("Enter the number of Vertexes:");
scanf("%d",&G.numVertexes);
for(i=0;i<G.numVertexes;++i)
{
for(j=0;j<G.numVertexes;++j)
{
scanf("%d",&G.arc[i][j]);
}
}*/
prim(G);
}
由算法代码中的循环嵌套可得知此算法的时间复杂度为O(n^2)。