python 实现dijkstra迪杰斯特拉算法
Dijkstra(迪杰斯特拉)算法是由荷兰计算机科学家狄克斯特拉于1959年提出的,它是一种用于计算图中一个节点到其他所有节点的最短路径的算法。该算法主要用于解决有权图(即图中的边有权值)中的最短路径问题,但不能直接用于求解图中任意两点间的最短路径,而是从一个源点出发,计算该源点到其他所有点的最短路径。算法的基本原理Dijkstra算法采用贪心策略,从起始点开始,逐步寻找最短路径,直至到达所有顶点
dijkstra迪杰斯特拉算法介绍
Dijkstra(迪杰斯特拉)算法是由荷兰计算机科学家狄克斯特拉于1959年提出的,它是一种用于计算图中一个节点到其他所有节点的最短路径的算法。该算法主要用于解决有权图(即图中的边有权值)中的最短路径问题,但不能直接用于求解图中任意两点间的最短路径,而是从一个源点出发,计算该源点到其他所有点的最短路径。
算法的基本原理
Dijkstra算法采用贪心策略,从起始点开始,逐步寻找最短路径,直至到达所有顶点。具体步骤如下:
初始化:
设定两个集合:S(已求出最短路径的顶点集合)和U(未求出最短路径的顶点集合)。
将起始点加入S,U中包括除起始点外的所有顶点。如果某顶点与起始点不相邻,则设置其距离为无穷大。
循环过程:
在U中选择距离起始点最近的顶点K,将其从U移到S中。
更新U中所有顶点到起始点的距离,通过检查是否可以通过顶点K来缩短这些距离。
重复上述步骤,直到U为空,即所有顶点都被加入到S中。
算法特点
贪心策略:每次从未确定最短路径的顶点中选择距离最小的顶点,更新其他顶点的最短路径。
广度优先遍历思想:以起始点为中心向外层层扩展,直到扩展到所有顶点。
适用于带权图:要求图中路径的权值不能为负。
应用场景
Dijkstra算法在处理带权值的具体实例中非常有用,如计算一个城市内各个乡镇到某一特定乡镇的最短路径。在现实生活中,该算法广泛应用于地图导航、网络路由选择、交通规划等领域。
请注意,虽然Dijkstra算法在处理单源最短路径问题时非常有效,但在处理大型图或需要频繁查询不同源点间的最短路径时,可能需要考虑更高效的算法或数据结构。
dijkstra迪杰斯特拉算法python实现样例
以下是用 Python 实现迪杰斯特拉算法的示例代码:
import heapq
def dijkstra(graph, source):
# 初始化距离字典和已访问节点集合
dist = {node: float('inf') for node in graph}
dist[source] = 0
visited = set()
# 使用优先队列存储距离和节点
pq = [(0, source)]
while pq:
# 弹出距离最小的节点
current_dist, current_node = heapq.heappop(pq)
# 如果当前节点已访问,继续下一次循环
if current_node in visited:
continue
# 更新当前节点的邻居节点的最短距离
for neighbor, weight in graph[current_node].items():
distance = current_dist + weight
if distance < dist[neighbor]:
dist[neighbor] = distance
heapq.heappush(pq, (distance, neighbor))
# 将当前节点标记为已访问
visited.add(current_node)
return dist
# 示例图的邻接矩阵表示
graph = {
'A': {'B': 6, 'C': 3},
'B': {'A': 6, 'C': 2, 'D': 5},
'C': {'A': 3, 'B': 2, 'D': 3, 'E': 4},
'D': {'B': 5, 'C': 3, 'E': 2, 'F': 3},
'E': {'C': 4, 'D': 2, 'F': 5},
'F': {'D': 3, 'E': 5}
}
source = 'A'
distances = dijkstra(graph, source)
print(distances)
运行以上代码将会输出源节点 ‘A’ 到其他节点的最短距离,示例图的输出结果如下:
{'A': 0, 'B': 5, 'C': 3, 'D': 6, 'E': 7, 'F': 9}
其中,键表示节点,值表示源节点到该节点的最短距离。
更多推荐
所有评论(0)