公式

D - 往復配達 / Round-Trip Delivery 解説 by sounansya


与えられるグラフは無向グラフであるため、頂点 \(1\) から頂点 \(T\) までの最短距離と頂点 \(T\) から頂点 \(1\) までの最短距離は一致します。したがって、頂点 \(1\) から頂点 \(T\) までの最短経路の距離の \(2\) 倍が求める答えとなります。

この最短距離はダイクストラ法で求めることができます。

実装例(Python3)

from heapq import heappush, heappop

INF = 10**18


def dijkstra(G, s):
    dist = [INF] * len(G)
    dist[s] = 0
    pq = [(0, s)]
    while pq:
        d, v = heappop(pq)
        if d > dist[v]:
            continue
        for u, weight in G[v]:
            nd = d + weight
            if dist[u] > nd:
                dist[u] = nd
                heappush(pq, (nd, u))
    return dist


n, m, t = map(int, input().split())
t -= 1
g = [[] for _ in range(n)]
for i in range(m):
    a, b, c = map(int, input().split())
    a, b = a - 1, b - 1
    g[a].append((b, c))
    g[b].append((a, c))

d = dijkstra(g, 0)
ans = d[t]
if ans == INF:
    print(-1)
else:
    print(2 * ans)

投稿日時:
最終更新: