Dijkstra(迪杰斯特拉)算法简介
目录
- 适用情形
- 思想
- 核心代码
- 设计实现更多功能
- 举例说明
适用情形
适用于权值为非负的图的单源最短路径
思想
在已知起点与终点的情况下。须有三个一维数组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(迪杰斯特拉)算法简介相关推荐
- 最短路径之Dijkstra(迪杰斯特拉)算法(无向图)
简介 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.由for循环可知,其时间 ...
- JavaScript实现dijkstra迪杰斯特拉算法(附完整源码)
JavaScript实现dijkstra迪杰斯特拉算法 PriorityQueue完整源代码 MinHeap.js完整源代码 Heap.js完整源代码 Comparator.js完整源代码 dijks ...
- C++实现Dijkstra(迪杰斯特拉)算法(附完整源码)
C++Dijkstra迪杰斯特拉算法的实现 C++Dijkstra(迪杰斯特拉)算法的完整源码(定义,实现,main函数测试) C++Dijkstra(迪杰斯特拉)算法的完整源码(定义,实现,main ...
- Dijkstra迪杰斯特拉算法 C++实现
本篇文章主要介绍了Dijkstra迪杰斯特拉算法的C++实现,文章包含两个部分,在第一部分中我会简单介绍迪杰斯特拉算法以及一些个人的理解,第二部分会对C++代码的逻辑进行解释.下面是我已经上传的代码资 ...
- Dijkstra(迪杰斯特拉)算法求单源最短路径问题
Dijkstra(迪杰斯特拉)算法求单源最短路径问题 重要的事情说三遍:代码不是我写的!代码不是我写的!代码不是我写的! 第一个算法是严蔚敏数据结构(C语言版)上写的,第二个算法是王道数据结构上写的, ...
- MATLAB轻松绘制地图路线——Dijkstra(迪杰斯特拉)算法最短路径规划
文章目录 1. 地图绘制 2. 计算各节点之间的距离 3. Dijkstra(迪杰斯特拉)算法 4. 根据计算出的距离利用Dijkstra(迪杰斯特拉)算法找出指定节点之间的最短路径 工程文件(可直接 ...
- Dijkstra(迪杰斯特拉)算法
一.简介 迪克斯特拉算法又名Dijkstra算法(属于贪心算法).Dijkstra算法是从一节点到其余各节点最短路径计算方法. 迪杰斯特拉算法以起始点为中心向外层层扩展,直到扩展到终点为止. 算法思想 ...
- C语言实现Dijkstra(迪杰斯特拉)算法(附完整源码)
Dijkstra迪杰斯特拉 Graph结构体定义 迪杰斯特拉算法完整源码(定义,实现,main函数测试) Graph结构体定义 struct Graph {int vertexNum;int **ed ...
- dijkstra迪杰斯特拉算法(邻接表法)
算法简易过程: 迪杰斯特拉算法(朴素) O(n^2) G={V,E} V:点集合 E:边集合 初始化时 令 S={某源点ear}, T=V-S= {其余顶点},T中顶点对应的距离(ear, Vi)值若 ...
- 算法提升:图的Dijkstra(迪杰斯特拉)算法
目录 概念 思路 代码 概念 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路 ...
最新文章
- python 管道游戏_Python实现超级玛丽游戏系列教程05添加地面,管道和阶梯冲突检测...
- TCP/IP/ICMP 学习实践
- idea redis 插件_Redis客户端RDM收费后,还有哪些开源的替代品呢?
- mysql8.0.13安装版_windows下mysql 8.0.13 解压版安装图文教程
- Memcached通用类(基于enyim.com Memcached Client)
- 【TensorFlow-windows】学习笔记二——低级API
- c# bool?和bool_C#中的bool关键字
- 蒂法html5游戏,《最终幻想7:重制版》大量新截图:蒂法招式/支线任务
- 学术谱系树:来看看你导师的师承
- Android4.0/Android4.1 WifiStateMachine状态机结构图
- 【Vue】v-if 、v-show、v-for指令,最基础的流程控制和循环处理
- 3.空域图像处理的洪荒之力
- 在线文字图标logo文章封面图生成工具
- oracle pfile 注释,Oracle pfile/spfile参数文件详解
- 多用户微信多级分销系统源码php,PHP微信多级三级分销体系源码 领取宝微信双领取_源码下载...
- 服务器时间修改方法,修改云服务器时间设置方法
- 计算机手动双面打印,记得要收藏 如何手动完成双面打印文档
- word三线表标题两条线之间如何出现空白间隔(论文必备)
- 使用gradle发布文件到maven仓库
- JDO与JPA哪个更好?
热门文章
- 人工智能微控制器体系结构
- 使用Keil语言的嵌入式C编程教程(上)
- 汽车HUD(Head-up Display)的技术难点
- 深度学习LiDAR定位:L3-Net
- 2021年大数据Hive(十一):Hive调优
- 2021年大数据基础(三):​​​​​​​​​​​​​​​​​​​​​大数据应用场景
- 虚拟机为cenots配置网络
- Python ModuleNotFoundError: No module named ‘xlrd‘
- ERROR: Failed to resolve: com.android.support:appcompat-v7:29.0.0
- Go语言调度器之调度main goroutine(14)