计算机网络习题(Dijikstra算法)
题目描述:
利用Dijikstra算法求A到各点的最短路径。
知识点分析
(1)初始化两个集合(S, U)(S为只有初始顶点点A的集合,U为其他顶点集合);
(2)如果U不为空,对U集合顶点进行距离的排序,并取出距离A最近的一个顶点C;
i. 将顶点C的纳入S集合
ii.更新通过顶点C到达U集合所有点的距离(如果距离更小则更新,否则不更新)
iii. 重复2步骤
(3) 直到U集合为空,算法完成。
题目解答
python代码:
import heapq #提供堆算法
import math
graph = {
"A":{"B":5, "C":1},#字典,和A相连的是B(5),C(1)
"B":{"A":5, "C":2, "D":1},#字典,和B相连的是A(5),C(2),D(1)
"C":{"A":1, "B":2, "D":4, "E":8},#字典,和C相连的是A(2),B(2),D(4),E(8)
"D":{"B":1, "C":4, "E":3, "F":6},#字典,和D相连的是B(1),C(4),E(3),F(8)
"E":{"C":8, "D":3},#字典,和E相连的是C(8),D(3)
"F":{"D":6}#字典,和F相连的是D(6)
}
def init_distance(graph, s):
distance = {s : 0}
for vertex in graph:
if vertex != s:
distance[vertex] = math.inf#把所有点先设为正无穷
return distance
def dijkstra(graph, s):
pqueue = []
heapq.heappush(pqueue, (0, s))#将(0,s),推入pqueue
seen = set()#代表已经看过的节点
seen.add(s)
parent = {s : None}
distance = init_distance(graph, s)#当前点到起始点的距离
while(len(pqueue) > 0):
pair = heapq.heappop(pqueue)#将pqueue的最小值pop出pqueue,pair拿到的是一对点
dist = pair[0]
vertex = pair[1]
seen.add(vertex)#只有被pop出去的点,才算被看到
nodes = graph[vertex].keys()#将里面的值拿到
for w in nodes:
if w not in seen:#如果没有被看到,distance = dist+graph[vertex][w],类似于AC+CB=AB的距离
if dist + graph[vertex][w] < distance[w]:
heapq.heappush(pqueue, (dist + graph[vertex][w], w))
parent[w] = vertex
distance[w] = dist +graph[vertex][w]
return parent, distance
parent, distance = dijkstra(graph, "A")
print(parent)
print(distance)