思路:两次dijkstra求和。题目强调了是单向边,并且是单源最短路径问题,所以说很容易能够想到用一次dijkstra,求得邮局到其他点的最短路径。但是题目还说了,每次送完信还要回到邮局,并且由于是单向边,所以说就不能再走第一次dijkstra的路,回到邮局就是我们要算其他位置到邮局的最短路径。
这其实是一个多到一的问题,我们只需要额外建一个反向图,这样问题就能转化成标准的一到多dijkstra问题,然后就和第一次dijkstra的代码是一样的。所以说,我们就可以把dijkstra写成函数封装起来,然后分别去处理原图和反图,最终相加得到答案即可
代码:
import sys
from collections import deque
from heapq import heappop, heappush
input = lambda: sys.stdin.readline().strip()
import math
inf = 10 ** 18
def I():
return input()
def II():
return int(input())
def MII():
return map(int, input().split())
def GMI():
return map(lambda x: int(x) - 1, input().split())
def LI():
return input().split()
def LII():
return list(map(int, input().split()))
def LFI():
return list(map(float, input().split()))
fmax = lambda x, y: x if x > y else y
fmin = lambda x, y: x if x < y else y
isqrt = lambda x: int(math.sqrt(x))
'''
'''
def solve():
n, m = MII()
g = [[] for _ in range(n + 1)]
flip_g = [[] for _ in range(n + 1)]
for _ in range(m):
u, v, w = LII()
g[u].append((v, w))
flip_g[v].append((u, w))
def dijkstra(g):
dis = [inf] * (n + 1)
dis[1] = 0
h = [(0, 1)]
while h:
d, x = heappop(h)
if d > dis[x]:
continue
for y, w in g[x]:
new_dis = d + w
if new_dis < dis[y]:
dis[y] = new_dis
heappush(h, (new_dis, y))
return sum(dis[1:])
print(dijkstra(g) + dijkstra(flip_g))
t = 1
# t = II()
for _ in range(t):
solve()

京公网安备 11010502036488号