📜  Dijkstra算法在有向图中的最短路径(1)

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

Dijkstra算法在有向图中的最短路径

简介

Dijkstra算法是一种用于在加权有向图或无向图中寻找最短路径的算法。它和贪心算法有些相似,每次寻找离起始节点最近的未标记节点进行扩展。只不过对于已标记节点的权值可能会因为后续扩展而得到更新。

该算法最初由荷兰计算机科学家Edsger W. Dijkstra所发明。

算法过程
  1. 将所有节点标记为未标记。设置起始节点的距离为0。

  2. 对于起始节点的每个邻居节点,计算到该邻居节点的距离(即起始节点的距离加上该邻居节点到起始节点的距离),并将该距离保存到该邻居节点。同时标记邻居节点的前驱节点为起始节点。

  3. 将起始节点标记为已标记。

  4. 重复以下步骤,直到所有节点都被标记为已标记:

a. 从未标记节点中选择一条距离最小的节点,将其标记为已标记。

b. 对于该节点的每个邻居节点,计算到该邻居节点的距离(即该节点距离加上该邻居节点到该节点的距离),并将该距离与邻居节点当前保存的距离进行比较。如果该距离更小,则更新邻居节点的距离和前驱节点。

  1. 最终,每个节点的前驱节点都指向最短路径中该节点的前一个节点。
代码实现

以下是基于邻接矩阵实现Dijkstra算法的Python代码:

import sys

class Graph:
    def __init__(self, vertices):
        self.V = vertices
        self.graph = [[0 for column in range(vertices)] for row in range(vertices)]

    def printSolution(self, dist):
        print("Vertex \t Distance from Source")
        for node in range(self.V):
            print(node, "\t\t", dist[node])

    def minDistance(self, dist, sptSet):
        min = sys.maxsize
        for v in range(self.V):
            if dist[v] < min and sptSet[v] == False:
                min = dist[v]
                min_index = v
        return min_index

    def dijkstra(self, src):
        dist = [sys.maxsize] * self.V
        dist[src] = 0
        sptSet = [False] * self.V
        for cout in range(self.V):
            u = self.minDistance(dist, sptSet)
            sptSet[u] = True
            for v in range(self.V):
                if self.graph[u][v] > 0 and sptSet[v] == False and dist[v] > dist[u] + self.graph[u][v]:
                    dist[v] = dist[u] + self.graph[u][v]
        self.printSolution(dist)

代码中的Graph类初始化时构建了一个邻接矩阵,self.graph[i][j]表示节点i到节点j的距离。执行dijkstra方法时,从起点节点开始,按照Dijkstra算法的思路依次找到离该节点距离最近的节点,然后更新该节点邻居节点的距离。最终输出每个节点离起始节点的最短距离。

总结

Dijkstra算法是无向图或有向图的单源最短路径算法,在最坏情况下的时间复杂度为O(V^2),其中V为节点数。若采用堆优化等高级数据结构,也可以将时间复杂度优化至O(E*logV),其中E为边数。