该算法可以解决单源最短路径问题

单源指:以图中一个点作为源点,该算法用来求该源点到其他各个点的最短路径,我们代码中用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)算法详解,通俗易懂相关推荐

  1. 迪杰斯特拉(Dijkstra)算法详解

    迪杰斯特拉(Dijkstra)算法详解 在讲解迪杰斯特拉算法之前先讲解一下什么是最短路径: [图一] 假如我要求从A点到D点的最短路径,我们用肉眼可以很快速找出A–>C–>E–>D就 ...

  2. 059.迪杰斯特拉(Dijkstra)算法的原理以及解决最短路径问题

    1. 迪杰斯特拉(Dijkstra)算法的原理 1.1. 算法应用场景-最短路径问题 1.2. 基本介绍 1.3. 步骤详解 1.4. 思路解析 1.5. 图解步骤 2. 迪杰斯特拉(Dijkstra ...

  3. 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)

    目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...

  4. java数据结构和算法——迪杰斯特拉(Dijkstra)算法

    目录 一.迪杰斯特拉(Dijkstra)算法介绍 二.迪杰斯特拉(Dijkstra)算法过程 三.迪杰斯特拉(Dijkstra)算法--应用场景(最短路径问题) 四.迪杰斯特拉(Dijkstra)算法 ...

  5. 迪杰斯特拉(Dijkstra)算法解决最短路径问题

    Dijkstra 算法介绍 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法.迪杰斯特拉(Dijkstra)算法是最经典的最短路径算法之一,用 ...

  6. 最短路径算法-迪杰斯特拉(Dijkstra)算法

    最短路径算法-迪杰斯特拉(Dijkstra)算法 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先遍历思 ...

  7. Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法

    1.Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法 1.1 迪杰斯特拉(Dijkstra)算法 1.1.1 迪杰斯特拉(Dijkstra)算法介绍 迪杰斯特拉(Dijkstra ...

  8. java实现迪杰斯特拉(Dijkstra)算法求解最短路问题

    迪杰斯特拉(Dijkstra)算法是由荷兰计算机科学家狄克斯特拉于1959年提出的.是寻找从一个顶点到其余各顶点的最短路径算法,可用来解决最短路径问题. 迪杰斯特拉算法采用贪心算法的策略,将所有顶点分 ...

  9. 数据结构——图——迪杰斯特拉(Dijkstra )算法

    数据结构--图--迪杰斯特拉(Dijkstra )算法 这是一个按路径长度递增的次序产生最短路径的算法.它的思路大体是这样的. 比如说要求图7-7-3中顶点v0到顶点v1的最短距离,没有比这更简单的了 ...

  10. 狄克斯特拉(Dijkstra)算法详解

    1.前言 最近在看<算法图解>,其中第七章狄克斯特拉算法个人感觉并没有讲的清楚,比如看完7.1节给人的感觉是狄克斯特拉算法会遍历图中的每一条边,后续狄克斯特拉不适用负权边的说法就站不住脚了 ...

最新文章

  1. 一文总览机器学习中各种【熵】的含义及本质
  2. mysql迅速搭建网页_Django + mysql 快速搭建简单web投票系统
  3. TCP流量控制与拥塞控制区别
  4. 分布式数据库一定会替代Oracle吗?
  5. spring 构造函数注入_Spring构造函数依赖注入示例
  6. opencv9-膨胀和腐蚀
  7. 将您的SQL Server工作负载迁移到PostgreSQL –第3部分
  8. JavaScript之面向对象与原型笔记整理--------创建对象之原型(2)
  9. Linux命令解释之cp
  10. Linux下头文件.h的使用
  11. NOIP2016换教室 BZOJ 4720
  12. Ubuntu18.04/16.04 安装glog
  13. 量子计算和量子加密的基础问答
  14. Python 计算两点之间的距离
  15. html 广告弹窗代码,广告弹窗.html
  16. JAVA第一次授课心得_关于第一次java课的感想
  17. matlab消除多重共线性,多重共线性问题的几种解决方法-解决多重共线性的方法...
  18. ant design vue金额校验
  19. 关于国际论文中,国内外人名顺序的问题
  20. 如何通过js关闭微信浏览器页面

热门文章

  1. 最近抖音上虚拟元宇宙项目-猜歌名,代码解析
  2. MySQL之查询关键字
  3. 社会网络分析——Social Network Analysis
  4. VEH(向量化异常处理)
  5. win7如何设置通电自动开机_Win7环境下如何设置操作系统自动开机/关机
  6. ubuntu安装homeassistant
  7. (图文详细)设置文件夹中的文件显示文件后缀名的方法
  8. QQ能上网页打不开解决办法
  9. 爬虫实战 ——百度翻译
  10. 软考:嵌入式系统设计师