python 实现dijkstra迪杰斯特拉算法

dijkstra迪杰斯特拉算法介绍

Dijkstra(迪杰斯特拉)算法是由荷兰计算机科学家狄克斯特拉于1959年提出的,它是一种用于计算图中一个节点到其他所有节点的最短路径的算法。该算法主要用于解决有权图(即图中的边有权值)中的最短路径问题,但不能直接用于求解图中任意两点间的最短路径,而是从一个源点出发,计算该源点到其他所有点的最短路径。

算法的基本原理

Dijkstra算法采用贪心策略,从起始点开始,逐步寻找最短路径,直至到达所有顶点。具体步骤如下:

初始化:

设定两个集合:S(已求出最短路径的顶点集合)和U(未求出最短路径的顶点集合)。

将起始点加入S,U中包括除起始点外的所有顶点。如果某顶点与起始点不相邻,则设置其距离为无穷大。

循环过程:

在U中选择距离起始点最近的顶点K,将其从U移到S中。

更新U中所有顶点到起始点的距离,通过检查是否可以通过顶点K来缩短这些距离。

重复上述步骤,直到U为空,即所有顶点都被加入到S中。

算法特点

贪心策略:每次从未确定最短路径的顶点中选择距离最小的顶点,更新其他顶点的最短路径。

广度优先遍历思想:以起始点为中心向外层层扩展,直到扩展到所有顶点。

适用于带权图:要求图中路径的权值不能为负。

应用场景

Dijkstra算法在处理带权值的具体实例中非常有用,如计算一个城市内各个乡镇到某一特定乡镇的最短路径。在现实生活中,该算法广泛应用于地图导航、网络路由选择、交通规划等领域。

请注意,虽然Dijkstra算法在处理单源最短路径问题时非常有效,但在处理大型图或需要频繁查询不同源点间的最短路径时,可能需要考虑更高效的算法或数据结构。

dijkstra迪杰斯特拉算法python实现样例

以下是用 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}

其中,键表示节点,值表示源节点到该节点的最短距离。

相关推荐
宿州派大星3 小时前
Python实战:PyQt5 + OpenCV + Dlib 打造AI桌面应用
人工智能·python·qt
碧海银沙音频科技研究院4 小时前
炬芯ATS3089X手表的HFP通话不自动路由到设备BT的问题解决
网络·人工智能·嵌入式硬件·算法
承渊政道4 小时前
【从零开始大模型开发与微调:基于PyTorch与ChatGLM】(开源大模型ChatGLM高级定制化应用实战)
人工智能·pytorch·python·llm·模型微调·glm
专注仿真9 小时前
引擎扩展性与集成设计深度剖析:从 14 个扩展点到 DIS→HLA 演进之路
开发语言·算法·仿真引擎·推演引擎
码爸9 小时前
支持向量机介绍与示例
算法·机器学习·支持向量机
怕浪猫9 小时前
2028编程圈很火的10个Skills
算法·面试·github
Best-Wishes9 小时前
科来网络分析系统(技术交流版)使用说明书
开发语言·junit·php
Smoothcloud润云10 小时前
PyTorch大模型权重加载与启动耗时优化实战:定位磁盘、内存与显存瓶颈
人工智能·pytorch·python·深度学习·gpu算力
databook10 小时前
从循环到向量化:NumPy提速的7个关键思维
python·数据分析·numpy