AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。
出典:
AtCoder Beginner Contest 208 D – Shortest Path Queries 2
実はコンテスト本番では全く気づかず、経路を追加しながらダイクストラを用いるやり方でTLEを出してしまった(C++なら間に合ってたと思う)。アルゴリズムを適当に使うだけでなく、原理をちゃんと理解するって大事だなあ、と思い知らされた問題。
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()
関連