迪杰斯特拉(Dijkstra)算法详解,通俗易懂
该算法可以解决单源最短路径问题
单源指:以图中一个点作为源点,该算法用来求该源点到其他各个点的最短路径,我们代码中用dst数组记录
基本思想:
每次找到离源点最近的一个顶点u,然后再拿这个顶点u进行更新dst数组(即dst[k] = min(dst[k] , dst[u] + edge[u][k])),最终得到源点到其余所有点的最短路径
基本步骤:
一、把图中所有顶点分到俩个集合中,即最短路径的顶点集合S和未知最短路径的顶点集合Q。很显然初始时,只有源点在S集合中,其他顶点都在Q集合中。 在代码实现时,我们可以开一个bool型的数组mark,mark[i] = true表示i顶点在S集合中。mark[i] = false表示i顶点在Q集合中。
const int MAXN=1e5;bool mark[MAXN];memset(mark,0,sizeof mark); //除源点外,其他顶点在Q集合中
mark[1]=true; //顶点1作为源点,初始在S集合中
二、设置最短路径数组dst并不断更新:初始时:dst[i] = edge[s][i],(s为源点,edge为邻接矩阵)。dst[s] = 0, mark[s] = true. 此时在Q集合中选择一个离源点s最近的顶点u加入S集合中。
const int inf = 0x3f3f3f3f; //一个非常大的数,相当于无穷大
int u; //距离源点s最近的顶点uint min_path = inf;for(int j=1;j<=n;j++)
{if(mark[j] == 0 && dst[j] < min_path) //在集合Q中选择离源点s最近的顶点{min_path = dast[j];u = j;}mark[u] = true; //把找到的最近顶点u放到S集合中
}
然后拿新加入的顶点u进行更新dst数组,即在集合Q中找一个顶点k,如果原来顶点k到源点s的距离 > (顶点k到u的距离 + 顶点u到源点s的距离),那么更新 原来顶点k到源点s的距离 = (顶点k到u的距离 + 顶点u到源点s的距离)
for(int k=1;k<=n;k++)
{if(edge[u][k]<inf && mark[k] == 0) // u可以到达k并且,k在集合Q中{if(dst[k] > dst[u] + edge[u][k]) //原来顶点k到源点s的距离 > (顶点u到源点s的距离 + u //到k的距离){dst[k] = dst[u] + edge[u][k]; //顶点k到源点s的距离 = 源点s到顶点u的距离 + u到k的距离}}
}
三、在集合Q中再新找一个离源点s最近的顶点u加入集合S中,重复上面操作,直到所有顶点都到集合S中。dst数组中就是源点s到其他各个顶点的最短路径
完整代码
const int inf=0x3f3f3f3f;
const int MAXN=1e3 + 1;
int edge[MAXN][MAXN];
bool mark[MAXN]; //标记顶点在哪个集合
int dst[MAXN];//最短路径数组
int s; //s代表源点
int u; //中间顶点u
fill(edge,edge + MAXN*MAXN,inf);//先初始化邻接矩阵,再输入for(i = 1; i <= n; i++) dst[i] = edge[s][i]; //源点s到其他各个顶点距离的初始化
dst[s] = 0;
memset(mark,0,sizeof mark);
mark[s] = 1;
int min_path;
for(i = 1; i <= n-1; i++){ //初始源点已在集合S中,再放入n-1个顶点算法结束//找到离源点最近的顶点u,称它为新中心点min_path = inf;for(j = 1; j <= n; j++){if(mark[j] == 0 && dst[j] < min_path){min_path = dst[j];u = j;}}mark[u] = 1;//更新最短路径数组for(k = 1; k <= n; k++){if(edge[u][k] < inf && mark[k] == 0){if(dst[k] > dst[u] + edge[u][k])dst[k] = dst[u] + edge[u][k]; }}
}
迪杰斯特拉(Dijkstra)算法详解,通俗易懂相关推荐
- 迪杰斯特拉(Dijkstra)算法详解
迪杰斯特拉(Dijkstra)算法详解 在讲解迪杰斯特拉算法之前先讲解一下什么是最短路径: [图一] 假如我要求从A点到D点的最短路径,我们用肉眼可以很快速找出A–>C–>E–>D就 ...
- 059.迪杰斯特拉(Dijkstra)算法的原理以及解决最短路径问题
1. 迪杰斯特拉(Dijkstra)算法的原理 1.1. 算法应用场景-最短路径问题 1.2. 基本介绍 1.3. 步骤详解 1.4. 思路解析 1.5. 图解步骤 2. 迪杰斯特拉(Dijkstra ...
- 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)
目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...
- java数据结构和算法——迪杰斯特拉(Dijkstra)算法
目录 一.迪杰斯特拉(Dijkstra)算法介绍 二.迪杰斯特拉(Dijkstra)算法过程 三.迪杰斯特拉(Dijkstra)算法--应用场景(最短路径问题) 四.迪杰斯特拉(Dijkstra)算法 ...
- 迪杰斯特拉(Dijkstra)算法解决最短路径问题
Dijkstra 算法介绍 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法.迪杰斯特拉(Dijkstra)算法是最经典的最短路径算法之一,用 ...
- 最短路径算法-迪杰斯特拉(Dijkstra)算法
最短路径算法-迪杰斯特拉(Dijkstra)算法 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先遍历思 ...
- Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法
1.Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法 1.1 迪杰斯特拉(Dijkstra)算法 1.1.1 迪杰斯特拉(Dijkstra)算法介绍 迪杰斯特拉(Dijkstra ...
- java实现迪杰斯特拉(Dijkstra)算法求解最短路问题
迪杰斯特拉(Dijkstra)算法是由荷兰计算机科学家狄克斯特拉于1959年提出的.是寻找从一个顶点到其余各顶点的最短路径算法,可用来解决最短路径问题. 迪杰斯特拉算法采用贪心算法的策略,将所有顶点分 ...
- 数据结构——图——迪杰斯特拉(Dijkstra )算法
数据结构--图--迪杰斯特拉(Dijkstra )算法 这是一个按路径长度递增的次序产生最短路径的算法.它的思路大体是这样的. 比如说要求图7-7-3中顶点v0到顶点v1的最短距离,没有比这更简单的了 ...
- 狄克斯特拉(Dijkstra)算法详解
1.前言 最近在看<算法图解>,其中第七章狄克斯特拉算法个人感觉并没有讲的清楚,比如看完7.1节给人的感觉是狄克斯特拉算法会遍历图中的每一条边,后续狄克斯特拉不适用负权边的说法就站不住脚了 ...
最新文章
- 一文总览机器学习中各种【熵】的含义及本质
- mysql迅速搭建网页_Django + mysql 快速搭建简单web投票系统
- TCP流量控制与拥塞控制区别
- 分布式数据库一定会替代Oracle吗?
- spring 构造函数注入_Spring构造函数依赖注入示例
- opencv9-膨胀和腐蚀
- 将您的SQL Server工作负载迁移到PostgreSQL –第3部分
- JavaScript之面向对象与原型笔记整理--------创建对象之原型(2)
- Linux命令解释之cp
- Linux下头文件.h的使用
- NOIP2016换教室 BZOJ 4720
- Ubuntu18.04/16.04 安装glog
- 量子计算和量子加密的基础问答
- Python 计算两点之间的距离
- html 广告弹窗代码,广告弹窗.html
- JAVA第一次授课心得_关于第一次java课的感想
- matlab消除多重共线性,多重共线性问题的几种解决方法-解决多重共线性的方法...
- ant design vue金额校验
- 关于国际论文中,国内外人名顺序的问题
- 如何通过js关闭微信浏览器页面