Official

D - 救急搬送ネットワーク / Emergency Transport Network Editorial by harurun4635


頂点 \(S\) からの最短距離をすべての頂点 \(i\) について列挙すればよいです。

グラフは負辺がありませんから、dijkstra 法によって \(O((N + M) \log N)\) などで解くことができます。


実装例

from heapq import heappop, heappush

inf = 1 << 60
n, m, s = map(int, input().split())
s -= 1

e = [[] for i in range(n)]
for i in range(m):
    u, v, w = map(int, input().split())
    u -= 1
    v -= 1
    e[u].append((v, w))
    e[v].append((u, w))

d = [inf] * n
d[s] = 0
que = [(0, s)]
while que:
    nd, u = heappop(que)
    if d[u] != nd: continue
    
    for v, w in e[u]:
        if nd + w < d[v]:
            d[v] = nd + w
            heappush(que, (nd + w, v))

ans = 0
for i in range(n):
    if d[i] != inf:
        ans += d[i]
print(ans)

posted:
last update: