Dijkstra’s 算法
该算法是求图中最短路径的一个算法,使用该算法的前提是每条边的权重为非负值。
思路:首先选好开始节点,因为距离都是相对的,根节点的距离设为0(自己到自己的距离肯定是0),除了根节点之外的点的距离初始值设为inf(无穷大),之后用一个优先级队列来存放要访问的节点,每次都访问距离根节点最短的节点(其基本思想就是贪心算法的思想,每次先访问到根节点距离最短的节点,然后就能找到最短路径)
import heapq
#以下图为例子
graph = {
"A":{"B":5,"C":1},
"B":{"A":5,"C":2,"D":1},
"C":{"A":1,"B":2,"D":4,"E":8},
"D":{"B":1,"C":4,"E":3,"F":6},
"E":{"C":8,"D":3},
"F":{"D":6}
}
def Dijkstra's(graph,start):
distance = []
for i in graph:
if i == start:
distance.append(0)
else:
distance.append(float('inf'))
pqueue = []
seen = [] #表示已经访问过的点
heapq.heappush(pqueue,(0,start))#将节点和其距离根节点的距离以元组的形式存入pqueue中方便读取
while len(pqueue) != 0:
pair = heap.heappop(pqueue)
dist = pair[0] #表示该点到根节点的距离
vertex = pair[1] #表示正在访问的节点
seen.append(vertex)
for i in adj_list[vertex]:
if i not in seen:
if dist + graph[vertex][i] < distance[i]:
heap.heappush(pqueue,(dist + graph[vertex][i], i))
distacne[i] = dist + graph[vertex][i]
return distance