百俊1956運動


import sys
input = sys.stdin.readline

INF = int(1e9)

v, e = map(int, input().split())
g = [[INF] * v for _ in range(v)]
for _ in range(e):
    a, b, c = map(int, input().split())
    g[a-1][b-1] = c

for k in range(v):
    for i in range(v):
        for j in range(v):
            g[i][j] = min(g[i][j], g[i][k] + g[k][j])
ans = INF
for i in range(v):
    ans = min(ans, g[i][i])
if ans == INF:
    print(-1)
else:
    print(ans)
最初に記述されたコード(通過):最初は自分へのパスがなく、0に初期化されず、floodとshallを無限に保持すると仮定した.
import sys
input = sys.stdin.readline

INF = int(1e9)

v, e = map(int, input().split())
g = [[INF] * v for _ in range(v)]
for _ in range(e):
    a, b, c = map(int, input().split())
    g[a-1][b-1] = c
for i in range(v):
    g[i][i] = 0

for k in range(v):
    for i in range(v):
        for j in range(v):
            g[i][j] = min(g[i][j], g[i][k] + g[k][j])

ans = INF
for i in range(v):
    for j in range(v):
        ans = min(ans, g[j][i] + g[i][j])

if ans == INF:
    print(-1)
else:
    print(ans)
直接自分へのパスを無限長に維持し、フロイドと邵爾と、自分->任意のノード->自分へのパス(周期)の最短距離を見つけます.
=>どうしてだめなの?
for i in range(v):
    for j in range(v):
        if i != j:
            ans = min(ans, g[j][i] + g[i][j])
このように自分のルートを外せばいいのです自分で0と言ったら...カウントダウン...