dijkstra算法:寻找到全图各点的最短路径 您所在的位置:网站首页 用dijkstra方法求图11-41中v1到各点的最短路 dijkstra算法:寻找到全图各点的最短路径

dijkstra算法:寻找到全图各点的最短路径

2024-04-18 22:38| 来源: 网络整理| 查看: 265

dijkstra算法介绍:即迪杰斯特拉算法,是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止,是一种广度优先的搜索方法。 dijkstra算法原理:最优子路径存在。假设从S→E存在一条最短路径SE,且该路径经过点A,那么可以确定SA子路径一定是S→A的最短路径。证明:反证法。如果子路径SA不是最短的,那么就必然存在一条更短的'SA,从而SE路径也就不是最短,与原假设矛盾。 dijkstra算法缺点:与此前说过的viterbi不同,此算法能够求出从起点到其余每个结点的最短路径,所以需要遍历所有的路径和结点,计算复杂度比较大。 dijkstra算法例子:求从结点0到各个结点的最短路径。

 

step1:首先建立两个集合S={}:表示已经找到最短路径的结点;U={}:表示尚未找到最短路径的结点。显然,S与U互为补集,S U U=所有结点组成的集合,当U为空的时候算法结束,所有结点最短路径均已找到。 step2:建立一个数组dist[i],用于存放起点0到该结点i的最短路径(可能需要更新,接下来会解释)。然后再建立一个布尔数组s[i](初值均为0),用于表示该结点是否已经找到最短路径,如已经找到便不再遍历。 step3:具体执行部分: A:初始点设定。对于结点0,首先将其纳入到S集合中,然后寻找并计算与结点0直接相连路径的长度,即dist[1]=100,dist[30]=2,dist[4]=10(这时dist[0]=0)。而不能直接到达的结点距离为无限大∞。这里使用dist[3]=99999,方便程序比较大小。然后使s[0]=1,表示已经遍历过该结点。 B:选取最小dist[i]。比较dist[1],dist[3],dist[4]的长度,选择长度最短的dist[4],并将结点4纳入到S集合中,令s[4]=1,表明0到4的最短路径已经找到,且值为10。原因:最优子路径存在原理。由于dist[1],dist[3]均大于dist[4],所以若选择走经过结点1、3到达结点4路径,无论如何也不可能找到一条小于直接从结点0到结点4的路径!这个结论非常非常非常重要,是理解这个算法的关键!后面会反复用到,每一轮循环都要比较并选取最小的dist[i]。 C:更新dist[i]。现在,我们开始以结点4为中心向外扩展(广度优先)。现在,结点4可以到达结点3了,也表明从结点0可以通过结点4到达结点3了。至于要更新dist[i]的原因如下图: 在第一次选择中,我们纳入了起点A,然后由于dist[C]=6



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有