迪杰斯特拉算法python实现

来源:互联网 发布:虚拟机linux网不可用 编辑:程序博客网 时间:2024/06/06 01:58

回顾下最短路径的地杰斯特拉算法

迪杰斯特拉算法是求从某一个起点到其余所有结点的最短路径,是一对多的映射关系,是一种贪婪算法

示例:
这里写图片描述

算法实现流程思路:
迪杰斯特拉算法每次只找离起点最近的一个结点,并将之并入已经访问过结点的集合(以防重复访问,陷入死循环),然后将刚找到的最短路径的结点作为中间结点来更新相邻结点的路径长度,这样循环找到图中一个个结点的最短路径。

# dists定义了图,记录着从从起点出发到其他顶点的距离dist={1:{2:1,3:12},      2:{3:9,4:3},      3:{5:5},      4:{3:4,5:13,6:15},      5:{6:4},      6:{6:0}}cost={1:0,2:1,3:12,4:999,5:999,6:999}  # 由起点(结点1)到其余顶点的最短距离,999代表无法到达parents={1:None,2:1,3:2,4:2,5:3,6:5}   # parent代表到达这个结点的最短路径的前一个结点visited=[1]   # 起始结点默认已经访问过
# 找到还没有访问的结点中路径最短的一个结点def findShorestNode(cost):    minDist=999    node=None    for i in dist.keys():        if (cost[i]<minDist)&(i not in visited):            minDist=cost[i]            node=i    return node
# 更新最短路径node=findShorestNode(cost)while node:    for i in dist[node]:  # 所有node结点的邻居结点        newcost=cost[node]+dist[node][i]        if newcost<cost[i]:            parents[i]=node            cost[i]=newcost    visited.append(node)    node=findShorestNode(cost)
# 打印出从1到6的最短路径parent=parents[6]while parent:    print(parent)    parent=parents[parent]

结果:
这里写图片描述