简单理解Dijstra算法

  1. 算法简介:迪杰斯特拉算法是求解单源最短路径的一种算法。将节点分为已选择和未被选择,每次从未被选择的节点中选取与源节点具有最短距离的节点,将其加入到已被选择的节点中,同时,更新所有节点到源节点的最短距离。
  2. 设计思路:其主要思想是贪心算法,每一次在未被选择的节点中选择与源节点具有最短距离的节点。选择此节点node之后,利用此节点node更新源节点到其他节点的距离,即比较此源节点到节点i的距离和(源节点到node的距离+node到i的距离)。可利用邻接矩阵存储图的数据。需要一个dis[]数组存储源节点到其他节点之间的最短距离,state[]数组存储节点是否被选择。每次用贪心算法在未被选择的节点中选取与源节点具有最短距离的节点。

 3.代码:

/*Dijstra算法*/
#include <iostream>
using namespace std;
#define number 4        //定义节点数量
#define INT 0x3f3f3f3f    //定义无穷大

/*节点距离:*/
int edge[number][number] = {
    {0,3,7,4},
    {3,0,2,INT},
    {7,2,0,2},
    {4,INT,2,0}
};

int main()
{
    /*Dijstra算法:贪心算法+松弛法*/
    int dis[number];    //定义第一个节点到其他节点的最短距离
    bool state[number] = {false}; //定义每个节点是否已被选择

    memset(dis, INT, sizeof(dis));
   
    dis[0] = 0;

    for (int i = 0; i < number; i++)
    {
        int node = -1;  //当前与源节点具有最短距离的节点
        for (int j = 0; j < number; j++)
        {
            if (!state[j] && (node == -1 || dis[j] < dis[node]))
            {
                node = j;
            }
        }

        //利用node节点更新源节点到其他节点之间的距离
        for (int k = 0; k < number; k++)
        {
            if ((dis[node] + edge[node][k]) < dis[k])
            {
                dis[k] = dis[node] + edge[node][k];
            }
        }
        state[node] = true;
    }

    cout << "节点0到其他节点的最短距离为:" << endl;
    for (int i = 0; i < number; i++)
    {
        cout << dis[i] <<"  ";
    }

    return 0;
}

 4.运行结果:

5.总结:迪杰斯特拉算法是一种求解单源最短路径的算法,即源节点到其他每个节点的最短路径。将节点分为已被选择和为被选择的两类节点,每次都在为被选择的节点中选择与源节点具有最短距离的节点(贪心算法),将其加入到已被选择节点中,同时,利用此节点更新源节点到其他的节点之间的最短距离。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值