图的应用之最短路径

本文详细介绍了迪杰斯特拉算法,适用于单源最短路径问题,尤其在带权图中(不包括负权值)。同时,文中概述了Floyd算法,可求得每对顶点间的最短路径,适用于带权图(无负权回路),并分析了两种算法的时间和空间复杂度。
摘要由CSDN通过智能技术生成

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

(1)适用范围
单源最短路径、带权图(不适合有负权值的带权图)、无权图

(2)算法描述
V 0 , V 1 , . . . , V n − 1 V_0,V_1,...,V_{n-1} V0,V1,...,Vn1是图的各个顶点,数组下标和各顶点的下标相对应

数组描述
final[n]标记各顶点是否已经找到最短路径,初始值都为false
distance[n]到各顶点的最短路径长度
path[n]路径上的前驱

1)从源顶点开始,初始化三个数组信息
final:将源顶点置为True
distance:源顶点置为0,源顶点的所有后继置为弧的权值
path:源顶点置为-1,源顶点的所有后继置为源顶点的下标
2)循环遍历所有顶点,找到还没确定最短路径且最短路径长度最小的顶点,将其标记为已找到最短路径。检查该顶点的所有后继,若其还未找到最短路径,则更新后继顶点的distance和path信息
distance:distance[顶点] = distance[前驱]+弧的权值
path:path[顶点]=前驱的下标
3)重复2)直到所有顶点都找到最短路径

(3)性能分析

指标性能
时间复杂度 O ( ∣ V ∣ 2 ) O(|V|^2) O(V2)
空间复杂度 O ( ∣ V ∣ ) O(|V|) O(V)

2.Floyd算法

(1)适用范围
每对顶点间的最短路径、带权图(可以用于负权值带权图但不适用于带负权回路的图)、无权图

(2)算法描述
利用了动态规划思想,设 V 0 , V 1 , . . . , V n − 1 V_0,V_1,...,V_{n-1} V0,V1,...,Vn1是图的各个顶点,数组下标和各顶点的下标相对应

二维数组描述
A k [ n ] [ n ] A^k[n][n] Ak[n][n]当前各顶点间的最短路径长度,初始值为各边的权值,即图的邻接矩阵
P a t h k [ n ] [ n ] Path^k[n][n] Pathk[n][n]两个顶点之间的中转顶点的下标,初始值都为-1

1)初始化 A k A^k Ak P a t h k Path^k Pathk两个二维数组,k的初始值为-1
2)遍历矩阵 A k A^k Ak,若 A k [ i ] [ k + 1 ] + A k [ k + 1 ] [ j ] < A k [ i ] [ j ] A^k[i][k+1]+A^k[k+1][j]<A^k[i][j] Ak[i][k+1]+Ak[k+1][j]<Ak[i][j],则 A k + 1 [ i ] [ j ] = A k [ i ] [ k + 1 ] + A k [ k + 1 ] [ j ] A^{k+1}[i][j]=A^k[i][k+1]+A^k[k+1][j] Ak+1[i][j]=Ak[i][k+1]+Ak[k+1][j] P a t h k + 1 [ i ] [ j ] = k + 1 Path^{k+1}[i][j]=k+1 Pathk+1[i][j]=k+1,否则 A k A^k Ak P a t h k Path^k Pathk保持原值
3)k++
4)重复步骤2)和3),直到 k > n − 1 k>n-1 k>n1

(3)性能分析

指标性能
时间复杂度 O ( ∣ V ∣ 3 ) O(|V|^3) O(V3)
空间复杂度 O ( ∣ V ∣ 2 ) O(|V|^2) O(V2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码届艺术家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值