图的应用—最短路径
应用问题:交通路径问题,选择最短路径
顶点——表示地点
弧——表示两个地点由路连通
弧上的权值——表两地点之间的路径,花费等。
实际就是:在有向网中A点(源点)到达B点(终点)的多个路径中,寻找一条各边权值之和最小的路径,即最短路径。
(最短路径和最小生成树不同,路径上不一定包含n个顶点,也不一样包含n-1条边)
1.第一类问题:两点之间最短路径
1.1.Dijkstra(迪杰斯特拉)算法:按照路径长度递增次序生产最短路径
1.初始化:先找从源点V到终点U是否有直达路径,即通过一条弧到达的路径
2.选择:从源点开始到下一个结点 这些路径中找出一条长度最端的路径(V,K)
3.跟新:然后对其余各条路径进行适当调整
若在图中存在弧(K , M),且(V, K) + (K, U) < (V,U)
则进行替换
在调整后的各条路径在,再找长度最短的路径,依次类推
例子:
1.初始化,令S = {V0 } T = {其余顶点}。T中顶点对应的距离值用辅助数组D存放。
D[i]初值:若<V0,Vi>存在,则为其权值,否则为∞。
2.将V0到其余各个结点的值找出来,如果可以直达记录其权值,如果需要经过其他结点才能到达则记为∞。结束后将选取一个其距离最小的顶点并入S集合中。
3.继续计算从V0到其余结点的权值,但是将V2结点看作V0的一部分。若加入的中间点从V0到Vi的距离比不加中间点的路径要短,则修改此距离。重复S = V为止。
4.重复之前步骤
1.2求所有路径间的最短路径
方法一:每次以一个顶点为源点,重复执行Dijkstran算法n次
方法二:Floyd(弗洛伊德)算法
2.第二类问题:某源点到其他各点最短路径
Floyd(弗洛伊德)算法
思想
逐个顶点试探加入
从Vi到Vj的所有可能存在的路径中
选出一条长度最短的路径
1.通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入一个矩阵S,矩阵S中的元素a[i][j]表示顶点i(第i个顶点)到顶点j(第j个顶点)的距离。先初始化设置一个n阶方阵,若存在弧<Vi,Vj>,则为对于权值,否则为∞
2.逐步设置在原直接路径中增加中间顶点,若加入中间顶点后路径变短,则修改,否则维持。所有顶点是贪玩则算法结束。(类似于
Dijkstra(迪杰斯特拉)算法逐步加入点来求最短距离)
原来A到C是11,途径B之后是4+2=6
在将c加入中间点,目前可以通过的中间点就由A,B,C。判断由开始点到终点可以经过中间点的最短路径
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)