普里姆算法举例

在这里插入图片描述

它会把所有、没有被添加进去的点和其他的点都比较一次大小,找出最小的距离的值。

假设总共有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;

}

 

代码和图片和描述中的内容有些许差异,但无太大影响。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值