朴素dijkstra
class Graph:
def __init__(self, n, edges):
self.n = n
self.INF = float('inf')
self.matrix = [[self.INF] * n for _ in range(n)]
for u, v, w in edges:
self.matrix[u][v] = w
def addEdge(self, edge):
u, v, w = edge
self.matrix[u][v] = w
def shortestPath(self, node1, node2):
distance = [self.INF] * self.n
distance[node1] = 0
vis = [False] * self.n
step = self.n
while False in vis and step > 0:
step -= 1
min_ind, min_val = self.INF, self.INF
for ind in range(self.n):
if distance[ind] < min_val and not vis[ind]:
min_ind, min_val = ind, distance[ind]
if min_ind == self.INF:
break
vis[min_ind] = True
for to_ind in range(self.n):
distance[to_ind] = min(distance[to_ind], distance[min_ind] + self.matrix[min_ind][to_ind])
return distance[node2] if distance[node2] != self.INF else -1
dijkstra+堆优化
from heapq import heappop, heappush
class Graph:
def __init__(self, n, edges):
self.n = n
self.INF = float('inf')
self.matrix = [[self.INF] * n for _ in range(n)]
for u, v, w in edges:
self.matrix[u][v] = w
def addEdge(self, edge):
u, v, w = edge
self.matrix[u][v] = w
def shortestPath(self, start, end):
distance = [self.INF] * self.n
distance[start] = 0
q = [(0, start)]
while q:
dis, now = heappop(q)
if now == end:
return dis
if dis > distance[now]:
continue
for to_ind in range(self.n):
if distance[to_ind] > dis + self.matrix[now][to_ind]:
distance[to_ind] = dis + self.matrix[now][to_ind]
heappush(q, (distance[to_ind], to_ind))
return -1