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

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

Dijkstra的邻接表表示算法

Dijkstra的算法是一种最短路径的贪婪算法。该算法通过使用一个数组来保存源节点与其他节点之间的距离和已知最短路径。该算法的主要思想是从源节点出发,依次考虑与源节点相邻的节点,更新它们到源节点的距离和已知最短路径。这个过程由不断选择距离最短的未访问节点来实现,并不断扩展其周围的节点。

邻接表表示

Dijkstra的算法可以通过邻接表来表示。邻接表是一个包含所有节点的链表数组,其中每个链表表示每个节点的邻居节点。因此,对于每个节点,我们需要维护它到源节点的距离和已知最短路径。

代码实现

下面是使用Python实现Dijkstra算法的代码,其中Graph类表示邻接表表示的图,使用heapq模块来实现优先队列:

import heapq

class Graph:
    def __init__(self, n):
        self.n = n
        self.adj_list = [[] for _ in range(n)]
        
    def add_edge(self, u, v, w):
        self.adj_list[u].append((v, w))
        self.adj_list[v].append((u, w))
    
    def dijkstra(self, s):
        dist = [float('inf')] * self.n
        dist[s] = 0
        heap = [(0, s)]
        while heap:
            d, u = heapq.heappop(heap)
            if d == dist[u]:
                for v, w in self.adj_list[u]:
                    if dist[v] > d + w:
                        dist[v] = d + w
                        heapq.heappush(heap, (dist[v], v))
        return dist

# 示例代码
g = Graph(5)
g.add_edge(0, 1, 2)
g.add_edge(0, 4, 4)
g.add_edge(1, 2, 3)
g.add_edge(2, 3, 1)
g.add_edge(3, 4, 3)

print(g.dijkstra(0))

该实现的时间复杂度为O(ElogV),其中V为节点数,E为边数。