迪杰斯特拉算法python实现

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

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

示例:
这里写图片描述

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

# 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]

结果:
这里写图片描述

以下是使用Dijkstra算法Python实现并打印路径的示例代码: ```python import sys class Graph: def __init__(self, vertices): self.V = vertices self.graph = [[0 for column in range(vertices)] for row in range(vertices)] def printPath(self, parent, j): if parent[j] == -1: print(j, end=' ') return self.printPath(parent, parent[j]) print(j, end=' ') def printSolution(self, dist, parent, src): print("Vertex \t Distance from Source \t Path") for node in range(self.V): print(node, "\t\t", dist[node], "\t\t", end='') self.printPath(parent, node) print() def minDistance(self, dist, sptSet): min = sys.maxsize for v in range(self.V): if dist[v] < min and sptSet[v] == False: min = dist[v] min_index = v return min_index def dijkstra(self, src): dist = [sys.maxsize] * self.V parent = [-1] * self.V dist[src] = 0 sptSet = [False] * self.V for cout in range(self.V): u = self.minDistance(dist, sptSet) sptSet[u] = True for v in range(self.V): if self.graph[u][v] > 0 and \ sptSet[v] == False and \ dist[v] > dist[u] + self.graph[u][v]: dist[v] = dist[u] + self.graph[u][v] parent[v] = u self.printSolution(dist, parent, src) ``` 在上面的代码中,我们首先定义了一个`Graph`类,其中`__init__`方法初始化了`V`个节点的图。然后,`printPath`方法用于打印源节点到目标节点的最短路径。`printSolution`方法用于打印从源节点到每个节点的距离及其路径。`minDistance`方法用于找到距离源节点最近的未访问节点。最后,`dijkstra`方法使用Dijkstra算法找到从源节点到每个节点的最短路径,并打印结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值