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}

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

相关推荐
Emilia486.3 分钟前
【Leetcode&nowcode&数据结构】单链表的应用(初阶)
c语言·数据结构·算法·leetcode
TwoAnts&DingJoy20 分钟前
数据分析-泊松分布
python·机器学习·数据挖掘·数据分析·统计学·泊松分布
JAVA学习通28 分钟前
JDK高版本特性总结与ZGC实践
java·jvm·算法
syty202031 分钟前
简简单单区块链
算法·哈希算法
Lxinccode33 分钟前
python(48) : 命名截图[Windows工具(3)]
开发语言·python·截图·快速截图
CoovallyAIHub35 分钟前
CLIP, DINO等多模型融合DreamSim,让电脑“看懂”图片有多像!模型融合成为热门!
深度学习·算法·计算机视觉
Giser探索家41 分钟前
遥感卫星升轨 / 降轨技术解析:对图像光照、对比度的影响及工程化应用
大数据·人工智能·算法·安全·计算机视觉·分类
仰泳的熊猫1 小时前
LeetCode:700. 二叉搜索树中的搜索
数据结构·c++·算法·leetcode
嵌入式-老费1 小时前
Easyx图形库应用(图形旋转)
算法
代码充电宝1 小时前
LeetCode 算法题【中等】189. 轮转数组
java·算法·leetcode·职场和发展·数组