結果

問題 No.17 2つの地点に泊まりたい
コンテスト
ユーザー szkhts
提出日時 2025-12-14 09:10:12
言語 Python3
(3.13.1 + numpy 2.2.1 + scipy 1.14.1)
結果
AC  
実行時間 83 ms / 5,000 ms
コード長 1,249 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 249 ms
コンパイル使用メモリ 12,544 KB
実行使用メモリ 10,496 KB
最終ジャッジ日時 2025-12-14 09:10:15
合計ジャッジ時間 2,986 ms
ジャッジサーバーID
(参考情報)
judge5 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 28
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#def solve():
import sys
input = sys.stdin.readline

INF = 10**15

# 地点数
N = int(input())

# 滞在コスト
stay = [int(input()) for _ in range(N)]

# 移動数
M = int(input())

# 距離行列
dist = [[INF] * N for _ in range(N)]
for i in range(N):
    dist[i][i] = 0

# 無向グラフ
for _ in range(M):
    a, b, c = map(int, input().split())
    dist[a][b] = min(dist[a][b], c)
    dist[b][a] = min(dist[b][a], c)

# ワーシャルフロイド
for k in range(N):
    for i in range(N):
        if dist[i][k] == INF:
            continue
        for j in range(N):
            if dist[k][j] == INF:
                continue
            if dist[i][j] > dist[i][k] + dist[k][j]:
                dist[i][j] = dist[i][k] + dist[k][j]

ans = INF

# 滞在地点A,Bを全探索(0とN-1を除外)
for A in range(1, N - 1):
    for B in range(1, N - 1):
        if A == B:
            continue
        if dist[0][A] == INF:
            continue
        if dist[A][B] == INF:
            continue
        if dist[B][N - 1] == INF:
            continue

        cost = (
            dist[0][A]
            + stay[A]
            + dist[A][B]
            + stay[B]
            + dist[B][N - 1]
        )
        ans = min(ans, cost)

print(ans)
0