http://wenku.baidu.com/view/b7e730c751e2524de518964bcf84b9d529ea2c46
文库里面有更具体的解释
实在不行 这个视频解释的也很详细
http://v.youku.com/v_show/id_XNjg1MDk5ODM2.html?f=21855299&o=1
//邻接矩阵的广度遍历算法
void MiniSpanTree_Prim(MGraph G)
{
int min, i, j, k;
int adjvex[MAXVEX]; // 保存相关顶点下标[0,0,1,0,0,0,1,0,1] 这个值表示什么呢?表示0和0之间的连线,1:表示2和1之间有联系,接下来1代表顶点元素6和1之间有联系。 1:8和1有联系;因为是从1出发的顶点看看各点和1的联系。
int lowcost[MAXVEX]; //存放相关顶点间边的权值。通过好多层迭代把每一行最短的值给筛选出来。生成最小生成树,得到都是边和边权值最小的连线。唯一的要求就是把所有的顶点都给连起来。
lowcost[0]=0; //v0作为最小生成树的根开始遍历,权值为0
adjvex[0] = 0; //v0第一个加入
//初始化操作
for(i=1; i<G.numVerteses; i++)
{
lowcost[i] = G.arc[0][i]; //将邻接矩阵第0行的所有权值先加入数组。
adjvex[i]=0; //初始化全部先为v0的下标。
}
//真正构造最小生成树的过程 分为两个过程: 1.循环所有结点找出lowcost数组已存储的最小权值
for(i=1; i<G.numVertexes;i++)
{
min = INFINITY; //初始化最小权值为65535等不可数值;
j = 1;
k = 0;
//退出循环直到从1--8里面找到真正的min。 这是给一个固定的顶点找到一个最小的值
while(j<G.numVerteses) //j从1开始 遍历1--8;因为下标是0--8,而0的话前面已经给初始化了。是第一个顶点已经无偿作为最小生成数的根结点。
{
//找出lowcost数组已存储的最小权值
if(lowcost[j]!=0 && lowcost[j]<min) //lowcost[j]!=0:自己和自己连线没意思。如果lowcost[j]<min的话,说明是有连线的。
{
min = lowcost[j]; //再从Lowcost中找到除自己外以及已经上次找到的最小距离的 中的 最小的权。
k = j//将发现的最小权值的下标存入k,以待使用;
}
j++;
}
//打印当前顶点边中权值最小的边;
printf("{%d,%d}=",adjvex[k],k); //adjvex 存放的是 上一个找到的顶点下边的值。 第一次循环打印的结果是,adjvex[1]=0; k==1
lowcost[k] = 0; //将当前顶点的权值设置为0,表示此顶点已经完成任务,进行下一个顶点的遍历;第一行权值内 只要有一个点完成任务,那么就设置为0;
//邻接矩阵k行逐个遍历全部结点;这个作用和上面不同,我们之前的lowcost初始值只有v0的这一行和vo连接点的一个权值,
//这里从k开始了 k的值是1,对k=这一行的遍历,然后呢?修改lowcost的值,如果第j的小于第一行的lowcost的话,那么就替换掉lowcost原来的值。
for(j=0; j<G.numVertexes;j++)
{
if(lowcost[j]!=0 && G.arc[k][j]<lowcost[j]) //第k行的权值小于lowcost[j] lowcost依然保持着第一行的的权值。
{
lowcost[j] = G.arc[k][j]; //lowcost里面所有的权值也是所替换掉的最小的权值。
adjvex[j] = k; //将下标k的顶点填到adjvex[j]中。作为我们待会打印的上一个顶点。将每一个替换的都adjvex都给输入进去。最终输出的结果就是adjvex里面所有的点都是按照顺序的最小权值的点。
}
}
}