计算机网络习题(Dijikstra算法)

计算机网络习题(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)

运行截图
B站学习视频链接

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KT_小蟹子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值