通用的深度优先搜索+图的应用2:最短路径

问题介绍:

带权图上的最小权重问题,即从一个顶点到另一个顶点的最小权重问题

问题解决方法:

  1. BFS 广度优先搜索(如果没有权重,只计算边的数量,就退化为词梯问题)
  2. Dijkstra算法

算法介绍:

  1. 通过将所有图的顶点放入优先队列中,其中起始顶点设置距离为0,其他顶点设置距离为系统最大值
  2. 将距离最小的顶点出队,更新与出队顶点相连接的各个顶点的距离值(加上权重),更新堆并重排
  3. 重复2的操作,更新堆
  4. 完成所有顶点的出队,此时可输出所有顶点的权重值


    image.png

算法代码如下:

from pythonds.garph import PriorityQueue, Graph, Vertex
def dijkstra(aGraph, start):
    pq = PriorityQueue()
    # 初始节点距离初始化为0
    start.setDistance(0)
    pq.buildHeap([(v.getDistance(), v) for v in aGraph])
    while not pq.isEmpty():
        # 将最小距离的顶点出队列
        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)

时间复杂度分析:

image.png

你可能感兴趣的:(通用的深度优先搜索+图的应用2:最短路径)