什么是Dijkstra算法?
Shortest Path Tree (SPT) 单源最短路径算法
从指定节点出发,到达任何其他节点的距离最短。
和K算法、P算法的区别是?
K算法、P算法,这两个算法都是最小生成树算法 Minimal Spanning Tree(MST),保证整个拓扑图的所有路径之和最小。
class Dijkstra:
"""
Shortest Path Tree (SPT) 单源最短路径算法
从指定节点出发,到达任何其他节点的距离最短
"""
def __init__(self):
pass
def weight(self, start, end):
# 返回节点start到end的权重
pass
def adj(self, s):
# 返回节点s的所有相邻节点
pass
def dijkstra(self, s, graph: List[List[int]]) -> List[int]:
"""
输入一张图和一个起点,计算该点到其他节点的最短路径
:param start:
:param graph:
:return:
"""
v = len(graph)
# dp table,distTo[i]可理解为节点s到节点i的最短路劲,后续要不停地更新该表
distTo = [float('inf')] * v
# base case
distTo[s] = 0
min_heap = []
# 从起点s开始BFS
heapq.heappush(min_heap, self.State(s, 0))
while min_heap:
curState = heapq.heappop(min_heap)
curNodeID = curState.id
curDistFromStart = curState.distFromStart
# 如果只关心start 节点到某一个终点end的最短距离,此处加入一个判断即可
# if curNodeID == end:
# return curDistFromStart
if curDistFromStart > distTo[curNodeID]:
# 已经有一条更短的路径到达curNode节点了
continue
# 遍历curNodeID的相邻节点
for nextNodeID in self.adj(curNodeID):
distToNextNode = curDistFromStart + self.weight(curNodeID, nextNodeID)
if distToNextNode < distTo[nextNodeID]:
# 更新dp table
distTo[nextNodeID] = distToNextNode
# 将该邻居节点加入优先级队列
heapq.heappush(min_heap, self.State(nextNodeID, distToNextNode))
class State:
def __init__(self, id, distFromStart):
"""
从start节点到当前节点的距离
:param id:
:param distFromStart:
"""
self.id = id
self.distFromStart = distFromStart
def __lt__(self, other):
if self.distFromStart < other.distFromStart:
return True
return False