python算法学习8(迪杰斯特拉算法)

迪杰斯特拉算法

1、迪杰斯特拉算法包含4个步骤:

  1. 找出最便宜个节点,既可以在最短的时间内前往的节点。
  2. 对于该节点的邻居,检查是否有前往他们的更短的路径,如果有,就更新其开销。
  3. 重复这个过程,直到图中的每个节点都这样做了。
  4. 计算出最终的路径。

在这里插入图片描述

# 创建整个图的散列表
graph = {}

graph["start"] = {} # 添加起点及其邻居
graph["start"]["a"] = 6
graph["start"]["b"] = 2
# print(graph["start"].keys()) #可以获取起点的所有邻居

graph["a"] = {} #添加其他节点及其邻居
graph["a"]["fin"] = 1

graph["b"] = {}
graph["b"]["a"] = 3
graph["b"]["fin"] = 5

graph["fin"] = {} # 终结点没有任何的邻居

# 创建散列表costs存储起点到每一个节点的开销
infinity = float("inf")  # 定义一个无穷大变量
costs = {}
costs["a"] = 6
costs["b"] = 2
costs["fin"] = infinity

# 创建存储父节点的散列表
parents = {}
parents["a"] = "start"
parents["b"] = "start"
parents["fin"] = None


# 创建一个数组用来存放处理过的节点,因为对于同一个节点不用处理多次
processed = [] # 存放处理过的节点

# 定义函数find_lowest_cost_node 用来在未处理的的节点中找出开销最小的节点
def find_lowest_cost_node(costs):
    lowest_cost = float("inf")
    lowest_cost_node = None
    for node in costs:  # 遍历所有的节点
        cost = costs[node]
        if cost < lowest_cost and node not in processed: # 如果当前节点的开销更低且未处理过,
            lowest_cost = cost                           # 就将其视为开销最低的节点
            lowest_cost_node = node
    return lowest_cost_node


node = find_lowest_cost_node(costs)# 在未处理的节点中找出开销最小的节点
while node is not None:
    cost = costs[node]
    neighbors = graph[node]
    for n in neighbors.keys(): # 遍历当前节点的所有的邻居
        new_cost = cost + neighbors[n]
        if costs[n] > new_cost: # 如果经当前节点前往该邻居更近,
            costs[n] = new_cost # 就更新该邻居的开销
            parents[n] = node   # 同时将该邻居的父节点设置为当前节点
    processed.append(node)      # 将当前节点标记为处理过
    node = find_lowest_cost_node(costs)  # 找出接下来要处理的节点,并继续参与循环
print("从起点到终点的最小花费为:{}".format(costs["fin"]))

lst = ["fin"]
a = "fin"
# print("fin",end='<--')
while(parents[a]!="start"):
    #print(parents[a],end='<--')
    lst += [parents[a]]
    a = parents[a]
lst += ['start'] # 此时路径为倒叙的
lst.reverse()    # 将路径列表取反
print("路 径 为".center(15,'*')+':',end='')
for i in lst[:-1:]:
    print(i + "——>",end='')
print("fin")
# print(lst[::],end="-->")

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
迪杰斯特拉最短路径算法是一种经典的单源最短路径算法,用于解决带权重的有向图或无向图中,从一个源点到其他所有顶点的最短路径问题。 算法的基本思想是通过逐步扩展离源点越来越近的顶点的方式,逐步确定源点到其他顶点的最短路径。具体实现时,需要维护两个集合S和V-S,其中S表示已经确定最短路径的顶点集合,V-S表示还未确定最短路径的顶点集合。初始时,S中只包含源点,V-S包含其他所有顶点。然后,每次从V-S中选择一个距离源点最近的顶点u加入到S中,并更新源点到其它顶点的距离。 下面是Python实现迪杰斯特拉最短路径算法的代码,以邻接矩阵表示的有向图为例: ```python import sys def dijkstra(graph, src): n = len(graph) dist = [sys.maxsize] * n # 记录源点到各个顶点的距离 visited = [False] * n # 标记顶点是否已加入S集合 dist[src] = 0 # 初始化源点到自身的距离为0 for _ in range(n): # 找到距离源点最近的未加入S集合的顶点 u = -1 min_dist = sys.maxsize for i in range(n): if not visited[i] and dist[i] < min_dist: u = i min_dist = dist[i] if u == -1: break visited[u] = True # 更新源点到所有邻居顶点的距离 for v in range(n): if not visited[v] and graph[u][v] != 0: dist[v] = min(dist[v], dist[u] + graph[u][v]) return dist # 有向图的邻接矩阵表示 graph = [[0, 10, 3, 0, 0], [0, 0, 1, 2, 0], [0, 4, 0, 8, 2], [0, 0, 0, 0, 7], [0, 0, 0, 9, 0]] print(dijkstra(graph, 0)) # 输出从源点0到其他各个顶点的最短距离 ``` 该代码中,dijkstra函数的参数graph是邻接矩阵表示的有向图,src是源点的索引。在dijkstra函数中,首先初始化源点到各个顶点的距离dist和标记顶点是否已加入S集合的visited数组。然后,在每一轮循环中,找到距离源点最近的未加入S集合的顶点u,并将其加入S集合中。然后,遍历源点的所有邻居顶点v,更新源点到v的距离。最后返回源点到其他所有顶点的最短距离dist。 运行上述代码,输出结果为:[0, 7, 3, 10, 5],表示源点0到其他各个顶点的最短距离。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Sunqk5665

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

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

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

打赏作者

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

抵扣说明:

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

余额充值