AtCoder Beginner Contest 012 D – バスと避けられない運命 をPython3で解く

Share

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

出典:
AtCoder Beginner Contest 012 D – バスと避けられない運命

ワーシャル・フロイド法のいいところは、一度回せばあらゆる経路の最小コストが\(O(1)\)で計算できる、ということ。しかし高橋君、いろいろなこだわりがあるな……。

# AtCoder Beginner Contest 012 D - バスと避けられない運命
# https://atcoder.jp/contests/abc012/tasks/abc012_4
# tag: ワーシャル・フロイド法 典型問題 高橋君

# 結局のところ各バス停間全通りの移動コストを確認する
# 必要があるので、ワーシャル・フロイド法を用いる。

# あとは、バス停ごとに最大コストを比較すればいい。

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

# 0-indexed に修正しつつ、移動時間の隣接行列を作成する。
dist = [[10**10] * N for _ in range(N)]
for i in range(N):
dist[i][i] = 0
for a, b, t in bus_dat:
a -= 1
b -= 1
dist[a][b] = t
dist[b][a] = t

# ワーシャル・フロイド法
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]

# 改めて、各バス停ごとの最大コストの最小値を求める。
result = min(max(dist[i]) for i in range(N))
print(result)

main()
Share

コメントを残す

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