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}

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

相关推荐
穿条秋裤到处跑2 分钟前
每日一道leetcode(2026.04.19):下标对中的最大距离
算法·leetcode·职场和发展
2301_773553623 分钟前
如何优化深分页场景下的回表代价_延迟关联与主键游标分页
jvm·数据库·python
CeshirenTester6 分钟前
字节开源 DeerFlow 2.0:智能体开始“自己干活”了
人工智能·python
weixin_5689960613 分钟前
Golang怎么实现跳表数据结构_Golang如何用Skip List实现有序数据的快速查找【方法】
jvm·数据库·python
网络安全实验室14 分钟前
【程序人生】程序员接私活常用平台汇总_嵌入式开发外包平台
网络·python·学习·程序人生·web安全·面试·职场和发展
深度学习lover15 分钟前
<数据集>yolo 葡萄叶片病害识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·葡萄叶片病害识别
Sag_ever15 分钟前
时间复杂度与空间复杂度超详细入门讲解
算法
念越16 分钟前
算法每日一题 Day03|快慢双指针解决快乐树问题
算法·力扣
2401_8371638918 分钟前
CSS如何实现列表项序号自定义_利用--before与content实现
jvm·数据库·python
ZPC821019 分钟前
MoveGroup 规划轨迹 → 直接交给 MoveIt2 Servo 执行
人工智能·算法·计算机视觉·机器人