📅  最后修改于: 2023-12-03 15:14:41.181000             🧑  作者: Mango
Dijkstra算法是一种用于在加权有向图或无向图中寻找最短路径的算法。它和贪心算法有些相似,每次寻找离起始节点最近的未标记节点进行扩展。只不过对于已标记节点的权值可能会因为后续扩展而得到更新。
该算法最初由荷兰计算机科学家Edsger W. Dijkstra所发明。
将所有节点标记为未标记。设置起始节点的距离为0。
对于起始节点的每个邻居节点,计算到该邻居节点的距离(即起始节点的距离加上该邻居节点到起始节点的距离),并将该距离保存到该邻居节点。同时标记邻居节点的前驱节点为起始节点。
将起始节点标记为已标记。
重复以下步骤,直到所有节点都被标记为已标记:
a. 从未标记节点中选择一条距离最小的节点,将其标记为已标记。
b. 对于该节点的每个邻居节点,计算到该邻居节点的距离(即该节点距离加上该邻居节点到该节点的距离),并将该距离与邻居节点当前保存的距离进行比较。如果该距离更小,则更新邻居节点的距离和前驱节点。
以下是基于邻接矩阵实现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为边数。