📜  Dijkstra 的邻接表表示算法 |贪婪算法8(1)

📅  最后修改于: 2023-12-03 15:00:24.942000             🧑  作者: Mango

Dijkstra的邻接表表示算法 |贪婪算法

算法介绍

Dijkstra算法是一种解决带有非负边权值的图的最短路径问题的贪婪算法。它通过维护一个距离源点到各个顶点的距离值的集合,在每一步操作中选择其中距离源点最近的一个顶点,然后以该顶点为中心进行松弛操作,最终得到源点到各个终点的最短距离值。

Dijkstra算法使用邻接表表示图,对于每个顶点维护一个数组,存储从该顶点到其他顶点的边。在选择距离源点最近的顶点时,可以使用优先队列加速排序。

算法实现

下面给出Dijkstra算法的Python实现:

import heapq

def dijkstra(graph, start):
    pq = [(0,start)] # 存储 (距离, 顶点) 的元组
    dist = {}
    while pq:
        (d,v) = heapq.heappop(pq) # 选择距离最小的顶点
        if v in dist:
            continue # 如果该顶点已经处理过,跳过
        dist[v] = d # 标记该顶点已经处理过,记录距离
        for neighbor,weight in graph[v].items():
            if neighbor not in dist:
                heapq.heappush(pq, (d+weight, neighbor)) # 将相邻顶点加入到优先队列
    return dist
程序说明

该程序输入一个以邻接表表示的图和一个起始顶点,输出一个字典,表示从起始顶点到其他各个顶点的最短距离。

该程序使用了Python的heapq模块,其内部实现了一个优先队列,可以高效地维护距离最小的顶点。

该程序使用字典来表示邻接表,其中每个键值对表示一个顶点和其所有的相邻顶点及其权值。

该程序的时间复杂度为O(|E|+|V|log|V|),其中E为边数,V为顶点数,主要的时间开销在于优先队列的维护。

参考资料