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}

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

相关推荐
归去_来兮7 小时前
拉格朗日插值算法原理及简单示例
算法·数据分析·拉格朗日插值
Flittly9 小时前
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(3)TodoWrite (待办写入)
python·agent
千寻girling13 小时前
一份不可多得的 《 Django 》 零基础入门教程
后端·python·面试
千寻girling13 小时前
Python 是用来做 AI 人工智能 的 , 不适合开发 Web 网站 | 《Web框架》
人工智能·后端·算法
颜酱17 小时前
一步步实现字符串计算器:从「转整数」到「带括号与优化」
javascript·后端·算法
databook17 小时前
探索视觉的边界:用 Manim 重现有趣的知觉错觉
python·动效
明月_清风18 小时前
Python 性能微观世界:列表推导式 vs for 循环
后端·python
明月_清风18 小时前
Python 性能翻身仗:从 O(n) 到 O(1) 的工程实践
后端·python
JaguarJack19 小时前
FrankenPHP 原生支持 Windows 了
后端·php·服务端
BingoGo19 小时前
FrankenPHP 原生支持 Windows 了
后端·php