dijkstra(堆优化版)
from collections import defaultdict
import heapq
def dijkstra(graph, n):
min_dist = [float('inf')]*n
visited = [False]*n
min_dist[0]=0
queue = []
heapq.heappush(queue,[0,0])
while(queue):
_, node = heapq.heappop(queue)
if visited[node]:
continue
visited[node]=True
check_list=graph[node]
for check_node, val in check_list:
if not visited[check_node]:
min_dist[check_node]= min(min_dist[check_node],min_dist[node]+val)
heapq.heappush(queue,[min_dist[check_node],check_node])
if min_dist[-1] == float('inf'):
print(-1)
else:
print(min_dist[-1])
if __name__=='__main__':
n,m = map(int, input().split())
graph = defaultdict(list)
for i in range(m):
s,e,v = map(int, input().split())
graph[s-1].append([e-1,v])
dijkstra(graph, n)
Bellman_ford 算法
- 所以对所有边松弛一次 能得到 与起点 一条边相连的节点最短距离。
def Bellman_ford(graph,n):
min_dist = [float('inf')]*n
min_dist[0]=0
for i in range(n-1):
update=False.
for edge in graph:
from_ = edge[0]
to_ = edge[1]
val = edge[2]
if min_dist[from_]!=float('inf') and min_dist[to_]>min_dist[from_]+val:
min_dist[to_]=min_dist[from_]+val
update=True
if not update:
break
if min_dist[-1]==float('inf'):
print('unconnected')
else:
print(min_dist[-1])
if __name__=='__main__':
n,m=map(int, input().split())
graph = []
for _ in range(m):
s,t,v = map(int, input().split())
graph.append([s-1,t-1,v])
Bellman_ford(graph,n)