目录

  • 适用情形
  • 思想
  • 核心代码
  • 设计实现更多功能
  • 举例说明

适用情形

适用于权值为非负的图的单源最短路径

思想

在已知起点与终点的情况下。须有三个一维数组S,U,dis,S用于记录已经查找过的点,U则记录未查找到的点,dis用于记录从起点到各个点间的距离。开始时,S中仅有起点,U中则是其它所有点,dis[起点]初始化为0,dis中其它元素则为起点到各点的距离,如果没有路径则可以记录为INF(无穷大)或者-1。然后寻找与起点最近的点,将它加入数组S中,再更新dis的最短路径。然后再找与起点最近的点,将它加入数组S中,再更新dis的最短路径。知道全部更新完成。

核心代码

//假设已知起点为u,点间的距离已存到二维数组map中,点间没有路径则存INF
int INF = 1e7;
int map[100][100];
int dis[100];
int u = 0;
int N = 100;           //N表示城市的数量
int flag[100];         //以数组flag记录点是否在数组S中void Dijkstra()
{//第一步:初始化两个数组for(int i = 0; i < N; i++){dis[i] = map[u][i];flag[i] = 0;}flag[u] = 1;dis[u] = 0;//以循环来表示重复接下来的步骤,确保找到每个点for(int i = 0; i < N; i++){//第二步:找到距离起点的最近点int temp = INF, t = u;for(int j = 0; j < N; j++){if(!flag[j] && dis[j] < INF){t = j;temp = dis[j];}}if(t == u)return;      //全部点已被找完则退出elseflag[t] = 1; //将找到的点加入S//第三步:更新dis数组for(int j = 0; j < N; j++){if(flag[j] == 0 && map[t][j]<INF && dis[j]>(dis[t]+map[t][j])){dis[j]=dis[t]+map[t][j];}}}
}

我将DIjkstra算法分为了三个步骤,即:
第一步:初始化两个数组
第二步:找到距离起点的最近点
第三步:更新dis数组

其中第二和第三步需用循环满足所有的点都被搜一遍。

设计实现更多功能

1.记录路径
加入一个记录中转点的数组即可
2.计算最短路径的条数
加入一个记录到每个点的路径的数量的数组即可
3.出现路径长度相同的情况,根据每个点的权选择特定路径
加入一个记录到该点的权量的数组即可

总的来说,需要实现什么功能就加上一个记录数据变化的数组即可。具体会在下面举例说明

举例说明

题目

分析:在这道题目中我们发现,不仅需要寻找最短路径的长度,还需要找到最短路径的条数,已经救援队数量最多的那条最短路径,故我们需加入上一部分说的三个数组。具体代码如下:

#include<iostream>
#define K 501using namespace std;int INF = 1e7;int N, M , S , D;
int teamnumber[K];   //记录每个城市的救援队数量
int map[K][K];       //记录城市间的路径距离
int father[K];       //记录中转点
int dis[K];          //记录起点到个点间的距离
int flag[K];         //记录每个点是否已经搜索
int number[K];       //记录起点到各点时路径的数量
int ts[K];           //记录救援队的数量void Dijkstra()
{//各数组的初始化fill(dis, dis+N, INF);fill(flag,flag+N, 0);fill(number, number+N, 0);fill(ts, ts+N, 0);for(int i = 0; i < N; i++){dis[i] = map[S][i];father[i] = i;}//我们保持flag[i] == 0,在第一次搜索中会首先检索到它,你也可以思考一下让它为0有什么好处dis[S] = 0;     number[S] = 1;ts[S] = teamnumber[S];//开始搜索每个点for(int i = 0; i < N; i++){int Min = INF, t = -1;for(int j = 0; j < N; j++){if(flag[j] == 0 && dis[j] < Min){Min = dis[j];t = j;}}if(t == -1)return;elseflag[t] = 1;     for(int j = 0; j < N; j++)   //注意两条路距离相同但权值不同的情况,故分两种情况讨论{if(flag[j] == 0 && (dis[t] + map[t][j]) < dis[j] && map[t][j] < INF){dis[j] = dis[t] + map[t][j];father[j] = t;ts[j] = ts[t] + teamnumber[j];number[j] = number[t];}else if(flag[j] == 0 && (dis[t] + map[t][j]) == dis[j] && map[t][j] < INF){if((ts[t] + teamnumber [j]) > ts[j]){ts[j] = ts[t] + teamnumber[j];father[j] = t;}number[j] += number[t];}}}
}//打印路径函数
void PP(int s, int d)
{while(father[d] != d){PP(s,father[d]);cout << father[d] << " ";return;}return;
}int main()
{cin >> N >> M >> S >> D;for(int i = 0; i < N; i++)cin >> teamnumber[i];for(int i = 0; i < N; i++){for(int j = 0; j < N; j++){map[i][j] = INF;}}int n, m ,d;for(int i = 0; i < M; i++){cin >> n >> m >> d;map[n][m] = d;map[m][n] = d;}Dijkstra();cout << number[D] << " " << ts[D] << endl;PP(S,D);cout << D;return 0;
}

需要注意的地方在代码上都有注释,如有问题可以在评论区提问。

Dijkstra(迪杰斯特拉)算法简介相关推荐

  1. 最短路径之Dijkstra(迪杰斯特拉)算法(无向图)

    简介      Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.由for循环可知,其时间 ...

  2. JavaScript实现dijkstra迪杰斯特拉算法(附完整源码)

    JavaScript实现dijkstra迪杰斯特拉算法 PriorityQueue完整源代码 MinHeap.js完整源代码 Heap.js完整源代码 Comparator.js完整源代码 dijks ...

  3. C++实现Dijkstra(迪杰斯特拉)算法(附完整源码)

    C++Dijkstra迪杰斯特拉算法的实现 C++Dijkstra(迪杰斯特拉)算法的完整源码(定义,实现,main函数测试) C++Dijkstra(迪杰斯特拉)算法的完整源码(定义,实现,main ...

  4. Dijkstra迪杰斯特拉算法 C++实现

    本篇文章主要介绍了Dijkstra迪杰斯特拉算法的C++实现,文章包含两个部分,在第一部分中我会简单介绍迪杰斯特拉算法以及一些个人的理解,第二部分会对C++代码的逻辑进行解释.下面是我已经上传的代码资 ...

  5. Dijkstra(迪杰斯特拉)算法求单源最短路径问题

    Dijkstra(迪杰斯特拉)算法求单源最短路径问题 重要的事情说三遍:代码不是我写的!代码不是我写的!代码不是我写的! 第一个算法是严蔚敏数据结构(C语言版)上写的,第二个算法是王道数据结构上写的, ...

  6. MATLAB轻松绘制地图路线——Dijkstra(迪杰斯特拉)算法最短路径规划

    文章目录 1. 地图绘制 2. 计算各节点之间的距离 3. Dijkstra(迪杰斯特拉)算法 4. 根据计算出的距离利用Dijkstra(迪杰斯特拉)算法找出指定节点之间的最短路径 工程文件(可直接 ...

  7. Dijkstra(迪杰斯特拉)算法

    一.简介 迪克斯特拉算法又名Dijkstra算法(属于贪心算法).Dijkstra算法是从一节点到其余各节点最短路径计算方法. 迪杰斯特拉算法以起始点为中心向外层层扩展,直到扩展到终点为止. 算法思想 ...

  8. C语言实现Dijkstra(迪杰斯特拉)算法(附完整源码)

    Dijkstra迪杰斯特拉 Graph结构体定义 迪杰斯特拉算法完整源码(定义,实现,main函数测试) Graph结构体定义 struct Graph {int vertexNum;int **ed ...

  9. dijkstra迪杰斯特拉算法(邻接表法)

    算法简易过程: 迪杰斯特拉算法(朴素) O(n^2) G={V,E} V:点集合 E:边集合 初始化时 令 S={某源点ear}, T=V-S= {其余顶点},T中顶点对应的距离(ear, Vi)值若 ...

  10. 算法提升:图的Dijkstra(迪杰斯特拉)算法

    目录 概念 思路 代码 概念 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路 ...

最新文章

  1. python 管道游戏_Python实现超级玛丽游戏系列教程05添加地面,管道和阶梯冲突检测...
  2. TCP/IP/ICMP 学习实践
  3. idea redis 插件_Redis客户端RDM收费后,还有哪些开源的替代品呢?
  4. mysql8.0.13安装版_windows下mysql 8.0.13 解压版安装图文教程
  5. Memcached通用类(基于enyim.com Memcached Client)
  6. 【TensorFlow-windows】学习笔记二——低级API
  7. c# bool?和bool_C#中的bool关键字
  8. 蒂法html5游戏,《最终幻想7:重制版》大量新截图:蒂法招式/支线任务
  9. 学术谱系树:来看看你导师的师承
  10. Android4.0/Android4.1 WifiStateMachine状态机结构图
  11. 【Vue】v-if 、v-show、v-for指令,最基础的流程控制和循环处理
  12. 3.空域图像处理的洪荒之力
  13. 在线文字图标logo文章封面图生成工具
  14. oracle pfile 注释,Oracle pfile/spfile参数文件详解
  15. 多用户微信多级分销系统源码php,PHP微信多级三级分销体系源码 领取宝微信双领取_源码下载...
  16. 服务器时间修改方法,修改云服务器时间设置方法
  17. 计算机手动双面打印,记得要收藏 如何手动完成双面打印文档
  18. word三线表标题两条线之间如何出现空白间隔(论文必备)
  19. 使用gradle发布文件到maven仓库
  20. JDO与JPA哪个更好?

热门文章

  1. 人工智能微控制器体系结构
  2. 使用Keil语言的嵌入式C编程教程(上)
  3. 汽车HUD(Head-up Display)的技术难点
  4. 深度学习LiDAR定位:L3-Net
  5. 2021年大数据Hive(十一):Hive调优
  6. 2021年大数据基础(三):​​​​​​​​​​​​​​​​​​​​​大数据应用场景
  7. 虚拟机为cenots配置网络
  8. Python ModuleNotFoundError: No module named ‘xlrd‘
  9. ERROR: Failed to resolve: com.android.support:appcompat-v7:29.0.0
  10. Go语言调度器之调度main goroutine(14)