它会把所有、没有被添加进去的点和其他的点都比较一次大小,找出最小的距离的值。
假设总共有6个顶点。
从v1开始,它会和v2、v3、v4、v5、v6查看一遍距离(因为v1已经被移除),并找到最小距离。
v3点距离最小,将该点移除。接下来看,从v3为起点,和v2、v4、v5、v6查找一遍距离(因为v1、v3已经被移除),并比较一遍找出最小距离,并找到最小距离。
v6点距离最小,将该点移除。接下来看,从v6为起点,和v2、v4、v5查找一遍距离(因为v1、v3、v6已经被移除),并比较一遍找出最小距离,并找到最小距离。
V4点距离最小,将该点移除。接下来看,从v4为起点,和v2、v5查找一遍距离(因为v1、v3、v4、v6已经被移除),并比较一遍找出最小距离,并找到最小距离。
V5点距离最小,将该点移除。接下来看,从v5为起点,和v2查找一遍距离(因为v1、v3、v4、v5、v6已经被移除),并比较一遍找出最小距离,并找到最小距离。
V2点距离最小,将改点移除。然后就没有了,就可以统计结果了,结果如下图:
//(2019.05.17)普里姆算法
#include<stdio.h>
#define N 6
#define startPosition 0
int a[N][N] = { { 0, 6, 1, 5,
9999, 9999 }, { 6, 0, 5, 9999, 3, 9999 }, { 1, 5, 0, 5, 6, 4 }, { 5, 9999, 5,
0, 9999, 2 }, { 9999, 3, 6, 9999, 0, 6 }, { 9999, 9999, 4, 2, 6, 0 } };
int main()
{
int closedgeLowCost[N];
int k = startPosition; //初始位置
printf("初始位置:%d\n", startPosition);
//距离赋初值
for (int i = 0; i < N; i++)
{
closedgeLowCost[i] = a[k][i];
}
for (int i = 0; i < N; i++)
{
//下面的第一个for循环是为了找到大于0的最小值
k = 9999;
//找出距离最短的地方
for (int j = 0; j < N; j++)
{
//如果k的初始位置还没有确定
if (k == 9999)
{
//确定一个k的初始位置
if (closedgeLowCost[j] != 0)
{
k = j;
}
}
//如果确定了k的初始位置,就找更小值
else if (0 < closedgeLowCost[j] && closedgeLowCost[j]
< closedgeLowCost[k])
{
k = j;
}
}
if (k == 9999)
{
break;
}
printf("接下来序号:%-8d最短距离:%-8d\n", k,
closedgeLowCost[k]);
//更新最短距离值
for (int j = 0; j < N; j++)
{
if (a[k][j] < closedgeLowCost[j])
{
closedgeLowCost[j] = a[k][j];
}
}
}
printf("输出已完成\n");
getchar();
return 0;
}
代码和图片和描述中的内容有些许差异,但无太大影响。