图的最短路径(迪杰斯特拉和弗洛伊德)算法

本文介绍了最短路径问题,重点讲解了迪杰斯特拉算法,包括算法思想、图解执行过程、代码执行过程以及时间复杂度。迪杰斯特拉算法常用于求图中某一顶点到其余各顶点的最短路径,其时间复杂度为O(n^2)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最短路径问题

文章目录:

  • 最短路径的概念
  • 迪杰斯特拉算法
  • 弗洛伊德算法

1.最短路径

    首先我们要清楚什么是最短路径,怎么样称为最短。
    概念:从图中的某个顶点出发到达另外一个顶点的所经过的边的权重(权值)之和最小的一条路径,称为最短路径。

在这里插入图片描述

知道了什么是最短路径之后,怎么样实现这个最短路径问题,找到给出某个图中的最短路径呢,下面介绍两种实现最短路径的算法(迪杰斯特拉和弗洛伊德)这里注意一点:
通常采用迪杰斯特拉算法求图中某一顶点到其余各顶点的最短路径
通常采用弗洛伊德算法求图中任意一对顶点间的最短路径
下面首先来讲解迪杰斯特拉算法

2.迪杰斯特拉算法

1.算法思想:

设有两个顶点集合S和T,集合S中存放图中已找到最短路径的顶点,集合T存放图中剩余顶点,初始状态时,集合S中只包含顶点V0,然后不断从集合T中选取到顶点v0路径长度最短的顶点Vu并入到集合S中。这里需要注意的是,集合S每并入一个新的顶点Vu,都要修改顶点V0到集合T中顶点的最短路径长度值。之后不断重复此过程,直到集合T的顶点全部并入到S中为止。
这里详细说一下为什么要每并入新的顶点都要修改顶点V0到集合T中顶点的最短路径长度值
在Vu被选入S中后,Vu被确定为最短路径上的顶点,此时Vu就像V0到达T中顶点的中转站,多了一个中转站,就会多一些到达T中顶点的新的路径,而这些新的路径有可能比之前V0到T中顶点的路径要短,因此如果比之前路径短的话需要修改原有V0到T中其他顶点的路径长度。

如图所示,首先刚开始1并入S中,并入后多了1—2的路径,原来0—2的路径长度为6,而现在通过1这个“中转站”,使得0—2的路径变为4+1=5小于原来0–2的路径长度6,所以就要修改之前0—2路径的长度。

在这里插入图片描述

相信你已经了解了很多,下面给出算法的执行过程:
2.图解执行过程

引进三个辅助数组:dist[],path[]和set[]。
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • dist[Vi]表示当前已找到的从V0到每个终点Vi的最短路径长度,它的初态为:若从V0到Vi有边,则dist[Vi]为边上的权值,否则置dist[Vi]为∞。
  • path[Vi]中保存从V0到Vi最短路径上Vi的前一个顶点假设最短路径上的顶点序列为V0,V1,V2…Vi-1,Vi,则path[Vi]=Vi-1;path[]的初态为:如果V0到Vi有边,则path[Vi]=V0,否则path[Vi]=-1。
  • set[]为标记数组,set[Vi]=0表示Vi在T中,即没
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值