【算法】动画图解Dijkstra算法及其实现代码

本文介绍了Dijkstra算法,一种基于贪心思想的最短路径算法。内容包括算法的优先队列实现,动画演示,详细讲解,手动模拟过程以及代码实现。此外,还讨论了在处理无向边时的调整方法,对于邻接矩阵和邻接表的处理方式。
摘要由CSDN通过智能技术生成

Dijkstra算法是基于贪心思想的一种求最短路径的算法。
他的实现基于优先队列这种数据结构

该算法的动画演示
该算法的详细讲解
在这里插入图片描述

手动模拟示意图的结果
在这里插入图片描述
实现代码:

#include <iostream>
#include <vector>
using namespace std;
#include<stack>
const int INF = 1000000000;
 
/*Dijkstra算法解决的是单源最短路径问题,即给定图MGrap(V,E)和起点s(起点又称为源点),
求从起点s到达其它顶点的最短距离,并将最短距离存储在矩阵d中*/
void Dijkstra(int n, int s, vector<vector<int>> MGrap, vector<bool>& vis, vector<int>& d, vector<int>& pre)
{
   
       /*
       param
       n:           顶点个数
       s:           源点
       MGrap:           图的邻接矩阵
       vis:         标记顶点是否已被访问
       d:           存储源点s到达其它顶点的最短距离
       pre:         存储从起点s到达顶点v的最短路径上v的前一个顶点 (新添加)
       */
       fill(d.begin(), d.end(), INF);                         //初始化最短距离矩阵,全部为INF
 
       for (int i = 0; i < n; ++i)                            //新添加
              pre[i] = i;
 
       d[s] = 0;                                              //起点s到达自身的距离为0
       for (int i = 0; i < n; ++i)
       {
   
              int u = -1;                                     //找到d[u]最小的u
              int MIN = INF;                                  //记录最小的d[u]
              for (int j = 0; j < n; ++j)                     //开始寻找最小的d[u]
              {
   
                     if (vis[j] == false && d[j] < MIN)
                     {
   
                           u = j;
                           MIN = d[j];
                     }
              }
              //找不到小于INF的d[u],说明剩下的顶点和起点s不连通
              if (u == -1)
                     return;
              vis[u] = true;                                  //标记u已被访问
              for (int v = 0; v < n; ++v)
              {
   
                     //遍历所有顶点,如果v未被访问&&u能够到达v&&以u为中介点可以使d[v]更优
                     if (vis[v] == false && d[u] + MGrap[u][v] < d[v]) {
   
                           d[v] = d[u] + MGrap[u][v];             //更新d[v]
                           pre[v] = u;                        //记录v的前驱顶点为u(新添加)
                     }
              }
       }
}
 
//输出从起点s到顶点v的最短路径
void DFSPrint(int s, int v, v
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值