美文网首页
7.8图的应用:最短路径问题

7.8图的应用:最短路径问题

作者: M_小七 | 来源:发表于2020-01-06 16:47 被阅读0次
最短路径问题:Dijkstra算法

❖解决带权最短路径问题的经典算法是以发明者命名的“Dijkstra算法”
❖这是一个迭代算法,得出从一个顶点到其余所有顶点的最短路径,很接近于广度优先搜索算法BFS的结果
❖具体实现上,在顶点Vertex类中的成员dist用于记录从开始顶点到本顶点的最短带权路径长度(权重之和),算法对图中的每个顶点迭代一次
❖顶点的访问次序由一个优先队列来控制,队列中作为优先级的是顶点的dist属性。
❖最初,只有开始顶点dist设为0,而其他所有顶点dist设为sys.maxsize(最大整数),全部加入优先队列。
❖随着队列中每个最低dist顶点率先出队
❖并计算它与邻接顶点的权重,会引起其它顶点dist的减小和修改,引起堆重排
❖并据更新后的dist优先级再依次出队


image.png
# 最短路径
# G - 无向赋权图
# start - 开始节点
# 返回从开始节点到其它所有节点的最短带权路径
from PriorityQueue import PriorityQueue
from Graph import Graph


def dijkstra(G, start):
    pq = PriorityQueue()  # 创建优先队列
    start.setDistance(0)  # 起点距离设置为0,其它节点距离默认maxsize
    # 将节点排入优先队列,start在最前面
    pq.buildHeap([(v.getDistance(), v) for v in G])
    while not pq.isEmpty():
        # 取从start开始距离最小的节点出队列,作为当前节点
        # 当前节点已解出最短路径
        currentVert = pq.delMin()
        # 遍历节点的所有邻接节点
        for nextVert in currentVert.getConnections():
            # 从当前节点出发,逐个加上邻接节点的距离进行检验
            newDist = currentVert.getDistance() + currentVert.getWeight(nextVert)
            # 如果小于邻接节点原有距离,就更新邻接节点
            if newDist < nextVert.getDistance():
                # 更新距离值
                nextVert.setDistance(newDist)
                # 更新返回路径
                nextVert.setPred(currentVert)
                # 更新优先队列
                pq.decreaseKey(nextVert, newDist)


需要注意的是,Dijkstra算法只能处理大于0的权重,如果图中出现负数权重,则算法会陷入无限循环

Dijkstra算法分析
❖首先,将所有顶点加入优先队列并建堆,时间复杂度为O(V)
❖其次,每个顶点仅出队1次,每次delMin花费O(logV),一共就是O(VlogV)
❖另外,每个边关联到的顶点会做一次decreaseKey操作(O(logV)),一共O(ElogV)
❖上面三个加在一起 , 数量级就是O((V+E)logV)

相关文章

  • 7.8图的应用:最短路径问题

    最短路径问题:Dijkstra算法 ❖解决带权最短路径问题的经典算法是以发明者命名的“Dijkstra算法”❖这是...

  • 图的应用-最短路径求解

    图的最短路径   图的最短路径是一个起点到一个终点之间最短的路径。  用于解决最短路径问题的算法被称做“最短路径算...

  • 数据结构与算法-图的最短路径Dijkstra算法&Floyd算法

    最短路径 最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。在...

  • 算法 | 最短路径问题

    最短路径 最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径,在...

  • 致懒癌:5分钟,学会时间管理的最短有效路径

    什么是最短路径: 最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短...

  • 数据结构与算法学习 (14)最短路径求解

    最短路径问题是图研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。 算法具体的形...

  • 数据结构与算法-最短路径问题

    最短路径问题是图研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。 算法具体的形...

  • 时间管理的最短有效路径

    最短有效路径问题是「图论」研究中的一个经典演算法问题,旨在寻找图(由点和路径组成的)中两点之间的最短路径,以最短的...

  • Go 解决最短路径问题

    最短路径问题 wiki:最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的...

  • 数据结构(17)-图之最短路径

    我们经常会面临对路径选择的问题,比如出行去某个地方,如何乘车路线最短等。其实这就是图的最短路径问题。对于非网图而言...

网友评论

      本文标题:7.8图的应用:最短路径问题

      本文链接:https://www.haomeiwen.com/subject/fmukactx.html