• 求最短路径经典算法详解-迪杰斯特拉(Dijkstra)、弗洛伊德(Floyd)


    什么是“迪杰斯特拉(Dijkstra)”算法?

      迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。

    用来解决什么样的问题?

      解决的是有权图中最短路径问题,给定带权有向图G=(V, E)和源点v∈V,求从v到G中其余各顶点的最短路径

    应用案例:

    1.计算机网络传输的问题:怎样找到一种最经济的方式,从一台计算机向网上所有其它计算机发送一条消息。

    2.交通运输问题,走那条路径最优

    解决思路步骤

      基本思想:设置一个集合S存放已经找到最短路径的顶点,S的初始状态只包含源点v,对vi∈V-S,假设从源点v到vi的有向边为最短路径。以后每求得一条最短路径v, …, vk,就将vk加入集合S中,并将路径v, …, vk , vi与原来的假设相比较,取路径长度较小者为最短路径。重复上述过程,直到集合V中全部顶点加入到集合S中。

      设计数据结构 :

      1、图的存储结构:带权的邻接矩阵存储结构 。

      2、数组dist[n]:每个分量dist[i]表示当前所找到的从始点v到终点vi的最短路径的长度。初态为:若从v到vi有弧,则dist[i]为弧上权值;否则置dist[i]为∞。

      3、数组path[n]:path[i]是一个字符串,表示当前所找到的从始点v到终点vi的最短路径。初态为:若从v到vi有弧,则path[i]为vvi;否则置path[i]空串。

      4、数组s[n]:存放源点和已经生成的终点,其初态为只有一个源点v。

    详细步骤及相关说明

    迪杰斯特拉算法(详细)

     

    Dist :存储了当前起点到其余各顶点的最短路径长度

    Path :存储了起点到其余各顶点的路径

    Set:标记了哪些顶点已经被选入了最短路径

    说明:

    +:表示起点到顶点没有直接相连

    -1:当前顶点在其最短路径上面没有前一个顶点或者没有关系

    初始状态

    0

    1

    2

    3

    4

    5

    6

    Dist

    0

    4

    6

    6

    +

    +

    +

    Path

    -1

    0

    0

    0

    -1

    -1

    -1

    Set

    1

    0

    0

    0

    0

    0

    0

    从某个定点到其余各个顶点的最短路径

    选择距离起点最近的那个顶点,将其并入,然后扫描图中未被并入顶点的所有顶点。

    当前从“起点0”到“当前顶点V”,就是dist数组中的值,然后看看从0经过刚并入顶点的到v的长度,如果:L(0- 刚并入顶点-V) < L(0-V),此时就更新起点0V的最短路径距离为L(0- 刚并入顶点-V),然后更新PathV的值为”刚并入顶点的序号”,否则不做更改。

    L(0- 刚并入顶点-V) < L(0-V)

    起点直接到某一个顶点长度:Dist

    这里的直接:不是指有直接的边相连,这里的直接指的是“经过上一次更新由起点不经过刚并入顶点到(顶点)4的最短路径”。

    终结点到顶点:必须是一条直接的边,尽管之间有一条路径,若不是直接相连也认为两者之间的距离为无穷大。

    第1次

    0

    1

    2

    3

    4

    5

    6

    Dist

    0

    4

    5

    6

    11

    +

    +

    Path

    -1

    0

    1

    0

    1

    -1

    -1

    Set

    1

    1

    0

    0

    0

    0

    0

    第2次

    0

    1

    2

    3

    4

    5

    6

    Dist

    0

    4

    6

    6

    +

    +

    +

    Path

    -1

    0

    0

    0

    -1

    -1

    -1

    Set

    1

    0

    0

    0

    0

    0

    0

    第3次

    0

    1

    2

    3

    4

    5

    6

    Dist

    0

    4

    5

    6

    11

    9

    +

    Path

    -1

    0

    1

    0

    1

    2

    -1

    Set

    1

    1

    1

    1

    0

    0

    0

    4

    0

    1

    2

    3

    4

    5

    6

    Dist

    0

    4

    5

    6

    10

    9

    17

    Path

    -1

    0

    1

    0

    5

    2

    5

    Set

    1

    1

    1

    1

    0

    1

    0

    5

    0

    1

    2

    3

    4

    5

    6

    Dist

    0

    4

    5

    6

    10

    9

    16

    Path

    -1

    0

    1

    0

    5

    2

    4

    Set

    1

    1

    1

    1

    1

    1

    0

    6

    0

    1

    2

    3

    4

    5

    6

    Dist

    0

    4

    5

    6

    10

    9

    16

    Path

    -1

    0

    1

    0

    5

    2

    4

    Set

    1

    1

    1

    1

    1

    1

    1

    综上可得:0-其余各顶点的最短路径

    0-6的路径为:0-1-2-5-4-6

     未完待续:后面加入“弗洛伊德(Floyd)”算法

  • 相关阅读:
    把csv文件导入数据库
    c# DataTable 针对xml、excel、csv导入和导出
    ASP.NET常用珍藏代码
    C# 判断图片链接是否存在
    在asp.net中长内容自动分页的实现.NET教程
    SQL代理服务启动不了SQLSERVERAGENT
    SQL重复记录查询(转载)
    在asp.net中长内容自动分页的实现.NET教程2
    根据年月来判断月里天数
    SQL字符串函数
  • 原文地址:https://www.cnblogs.com/tianwen9579/p/11458959.html
Copyright © 2020-2023  润新知