AtCoder Beginner Contest 070 D – Transit Tree Path をPython3で解く

Share

AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。

出典:
AtCoder Beginner Contest 070 D – Transit Tree Path

木における距離を求める問題。

# AtCoder Beginner Contest 070 D - Transit Tree Path
# https://atcoder.jp/contests/abc070/tasks/abc070_d
# tag: グラフ 木 最短距離 基礎問題

# x から、K を経由しつつ y に行く最短距離を求めるためには、
# x → K の最短距離と、K → y の最短距離が必要。

# ところで、今回の問題のグラフは方向が関係ない無向グラフに
# なっているので、x → K の最短距離と、K → x の最短距離は
# 等しい。

# つまり、クエリがなんであれ、K からすべての頂点への
# 最短経路が求まっていれば、O(1) で回答を得ることが可能。

# K からの最短距離については、グラフが木であることから、
# 単純に順番に確定していけば、それが最短距離になる。

def main():
    N = int(input())
    path_dat = [list(map(int, input().split())) for _ in range(N-1)]
    Q, K = map(int, input().split())
    K -= 1
    queries = [list(map(int, input().split())) for _ in range(Q)]

    paths = [[] for _ in range(N)]
    for a, b, c in path_dat:
        a -= 1
        b -= 1
        paths[a].append((b, c))
        paths[b].append((a, c))

    # 頂点 K からの距離を保存していく。
    dist = [-1] * N
    dist[K] = 0

    # 探索しつつ距離を決定していく。
    queue = [K]
    while queue:
        now = queue.pop()
        for nxt, dd in paths[now]:
            # 距離を確定済み=探索済みならスキップ。
            if dist[nxt] != -1:
                continue
            dist[nxt] = dist[now] + dd
            queue.append(nxt)

    # クエリ処理
    for x, y in queries:
        x -= 1
        y -= 1
        print(dist[x] + dist[y])

main()
Share

コメントを残す

メールアドレスが公開されることはありません。