何谓最短路径

顾名思义就是在一个图中,一个顶点到另外一个顶点的最短距离拉。那么这里有一点要注意,就是在网图中(边的权值各不相同)最短路径指的是俩点之间的连线权值最小;在非网图(边的权值都默认为1)中最短路径指的是边数最少的。

从一个顶点到其余各顶点的最短路径

采用迪克斯特拉算法求解,基本思想是:
还是利用数组来找出最短路径,先循环遍历出第一个顶点A离其他顶点的距离,然后存储到一个数组里,这时候数组里对应的每一位就是各个顶点到A的距离。
找出距离最小的那个顶点B,重新计算B到其他顶点的距离,这里有一点要说明一下:比如顶点C,他到顶点A的路径可能经过B,又或者直接从A到C。这时候就需要A到B的距离加上B到C的距离之和与A到C的距离做比较,取出较小的那个存储到数组中。
那么这样说是简单,通过代码怎么实现呢?

//先进行初始化
//循环遍历出第一个顶点A离其他顶点的距离,然后存储到一个数组里,这时候数组里对应的每一位就是各个顶点到A的距离。
for(i=0;i<g.n;i++)
{dist[i]=g.edges[v][i];s[i] = 0;                //s[i]标志着第i个顶点是否已经找到离某一点的最短路径if(g.edges[v][i]<INF)path[i] = g.edges[v][i];//path数组记录第i个顶点的上一个顶点位置elsepath[i] = -1;
}

关于s数组和path数组暂时不理解的可以看接下来的介绍。
接下来应该找出距离0顶点最近的那个点,就必须通过下面的代码:

min = INF;
//取出dist中最小的
for(j=0;j<g.n;j++)
{if(s[j]==0 && dist[j]<min){min = dist[j];u = j;}
}
s[u] = 1;

从上面的代码就可以找出距离顶点0权值最小的那个点了,从上面的思路中我们有提到dist数组存储的就是当前距离顶点0的权值最小的各条边。那么现在,我们要找出第三个顶点了,可以先看看下面的代码:

for(j=0;j<g.n;j++)
{if(s[u]==0)if(g.edges[u][j]<INF && dist[u]+g.edges[u][j]<dist[j]){dist[j] = dist[u]+g.edges[u][j];path[j] = u;}
}

这一段代码完成的功能就是取出遍历跟第二个顶点相连的所有顶点,判断这些顶点与第一个顶点的距离会不会大于先连接第二个顶点再连接第一个顶点的距离,简单点说就是现在有三个村庄a,b,c。那么要做的就是判断c村直接到a村比较近,还是先过b村,再去a村比较近。所以这一段就是迪克斯特拉算法的精华之处
那么整个算法就是:

void Dijkstra(MGraph g,int v)
{int dist[MAXV],path[MAXV];int s[MAXV];int i,j,min,u;for(i=0;i<g.n;i++){dist[i]=g.edges[v][i];s[i] = 0;if(g.edges[v][i]<INF)path[i] = g.edges[v][i];elsepath[i] = -1;       }for(i=0;i<g.n;i++){min = INF;//取出dist中最小的for(j=0;j<g.n;j++){if(s[j]==0 && dist[j]<min){min = dist[j];u = j;}}//经过上面的遍历已经取出dist中最小的了,接下来要做的就是访问这个形成最小距离的顶点u//设置已经访问s[u] = 1;for(j=0;j<g.n;j++){if(s[u]==0)if(g.edges[u][j]<INF && dist[u]+g.edges[u][j]<dist[j]){dist[j] = dist[u]+g.edges[u][j];path[j] = u;}}}
}

最短路径之迪克斯特拉(Dijkstra)算法相关推荐

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

    对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...

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

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

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

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

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

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

  5. c语言迪杰斯特拉算法求最短路径,迪杰斯特拉 ( Dijkstra ) 最短路径算法

    迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径.它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本 ...

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

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

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

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

  8. 【图】最短路径--迪杰斯特拉(Dijkdtra)算法

    迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 算法思想 每次找到离源 ...

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

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

最新文章

  1. Dynamic CRM 2013学习笔记(四十三)流程6 - 自定义流程活动
  2. 深入浅出Mysql(四)
  3. u-tools图床便捷生成markdown图片
  4. UIGestureRecognizer与UIButton Action在同一界面冲突的问题
  5. Hadoop2.x环境搭建
  6. 【环境搭建002】ubuntu 13 在vm 下的 NFS 搭建
  7. 手把手教你搭建FastDFS集群(中)
  8. MAC上编写汇编程序
  9. erdas2015几何校正模块在哪_几何校正和正射校正,怎样用erdas做几何校正?
  10. 巴塞尔协议中的计算公式_巴塞尔协议演变及计算方法简单解析
  11. 如何调试 fastlane 源码
  12. 【JS基础】e.preventDefault() 阻止默认操作
  13. 2021-08-07 STM32F103 Buffer SPI Transfer 缓冲通讯
  14. import cv2 报错(linux环境)ImportError: libGL.so.1: cannot open shared object file: No such file or direc
  15. 查mysql版本的命令
  16. Editplus如何设置中文页面
  17. Python [Leetcode 345]Reverse Vowels of a String
  18. 网吧运行linux,开Linux网吧行不行得通?
  19. Vue可视化大屏 利用缩放transform:scale实现分辨率自适应
  20. 7的整除特征 三位一截_7的整除特征(7,11,13的整除特征)

热门文章

  1. matlab2019b 读取excel数据并转换成.mat文件
  2. 大数据之路—— 数据整合和管理体系
  3. Java String的API方法总结
  4. SQLAlchemy ORM框架
  5. 申请电子面单号API接口文档
  6. 代码为什么那么乱! 换种方法学面向对象
  7. Linux自动挂载失败,linux – 在启动期间自动挂载单独分区时的systemd / udev依赖性失败...
  8. ubuntu安装qt出现错误解决
  9. openlayer地图导出指定范围图片文件
  10. 低版本IntelliJ IDEA升级到IntelliJ IDEA 2021.3.3