AtCoder Beginner Contest 208 D – Shortest Path Queries 2 をPython3で解く

Share

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

出典:
AtCoder Beginner Contest 208 D – Shortest Path Queries 2

実はコンテスト本番では全く気づかず、経路を追加しながらダイクストラを用いるやり方でTLEを出してしまった(C++なら間に合ってたと思う)。アルゴリズムを適当に使うだけでなく、原理をちゃんと理解するって大事だなあ、と思い知らされた問題。

# AtCoder Beginner Contest 208 D - Shortest Path Queries 2
# https://atcoder.jp/contests/abc208/tasks/abc208_d
# tag: ワーシャル・フロイド法 考察 高橋王国

# この問題の形は、ワーシャル・フロイド法における
# 計算過程を示したものとなっている。

# よって、通常通りワーシャル・フロイド法を回しつつ、
# 随時回答へと距離を足し合わせていく。

def main():
N, M = map(int, input().split())
dist_dat = [list(map(int, input().split())) for _ in range(M)]

dist = [[10**10] * N for _ in range(N)]
for i in range(N):
dist[i][i] = 0

for a, b, c in dist_dat:
a -= 1
b -= 1
dist[a][b] = c

result = 0
# ワーシャル・フロイド法。
for k in range(N):
for i in range(N):
for j in range(N):
if dist[i][j] > dist[i][k] + dist[k][j]:
dist[i][j] = dist[i][k] + dist[k][j]

# 到達可能なら、答えに足し合わせる。
if dist[i][j] != 10**10:
result += dist[i][j]

print(result)

main()
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です