图的应用—最短路径

应用问题:交通路径问题,选择最短路径

顶点——表示地点
弧——表示两个地点由路连通
弧上的权值——表两地点之间的路径,花费等。

实际就是:在有向网中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 = {V}   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。判断由开始点到终点可以经过中间点的最短路径

posted @   铜须的编程生活  阅读(194)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示