Updated:

๐Ÿ“š Floyd-Warshall

Floyd-Warshall์€ ๋ชจ๋“  ์ง€์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ง€์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ์ง€์ •๋œ ์ถœ๋ฐœ์ ์—์„œ ๋‚˜๋จธ์ง€ ๋‹ค๋ฅธ ์ง€์ ๊ฐ€์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์†”๋ฃจ์…˜์„ ๋„์ถœํ•˜๋Š” ๋ฐฉ์‹์—๋„ ์‚ด์ง ์ฐจ์ด๊ฐ€ ์ƒ๊ธฐ๋Š”๋ฐ, Floyd-Warshall ์€ ๊ทธ๋ฆฌ๋””ํ•˜๊ฒŒ ๋งค๋ฒˆ ์ตœ๋‹จ ๊ฒฝ๋กœ์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๊ตฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ด์œ ๋Š” ๋ชจ๋“  ์ง€์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ง€์ ๊นŒ์ง€์˜ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ฆฌ๋”” ๋Œ€์‹  DP Tabulation์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Floyd-Warshall ์€ ์ฃผ์–ด์ง„ $N$ ๊ฐœ์˜ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ๋งค๋ฒˆ $N^2$ ๋ฒˆ์˜ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ตœ์ข…์ ์œผ๋กœ $O(N^3)$ ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค. ์—ฐ์‚ฐ์€ ์ง์„  ๊ฒฝ๋กœ์™€ ๊ฒฝ์œ  ๊ฒฝ๋กœ๋ฅผ ๋น„๊ตํ•˜๋Š” ํ˜•ํƒœ๋กœ ์ด๋ค„์ง„๋‹ค. ๋‘˜ ์ค‘์—์„œ ๋” ์ž‘์€ ๊ฐ’์ด DP Table์— ์ €์žฅ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฒฝ์œ  ๊ฒฝ๋กœ๋ž€ ์ „์ฒด $N$ ๊ฐœ์˜ ๋…ธ๋“œ์— ๋Œ€ํ•œ iteration ์ค‘์—์„œ $i$ ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ๊ฒฝ์œ ํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ๋งํ•œ๋‹ค. ๋งŒ์•ฝ ์ง์„  ๊ฒฝ๋กœ๊ฐ€ [$d, k$]๋ผ๋ฉด ๊ฒฝ์œ  ๊ฒฝ๋กœ๋Š” [$d, i$] + [$i, k$] ๊ฐ€ ๋œ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ…Œ์ด๋ธ”์— ์ง์„  ๊ฒฝ๋กœ์™€ ๊ฒฝ์œ  ๊ฒฝ๋กœ์ค‘์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋งŒ ์ €์žฅํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ ‡๊ฒŒ ํ•˜๋‚˜์˜ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฒฝ์œ ํ•˜๋Š” ๊ฒฝ์šฐ๋งŒ ๊ณ ๋ คํ•ด๋„ ๊ดœ์ฐฎ๋‹ค. ๋งŒ์•ฝ 3๊ฐœ์˜ ์ค‘๊ฐ„ ๋…ธ๋“œ๋ฅผ ๊ฒฝ์œ ํ•ด์•ผ๋งŒ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๋˜๋Š” ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ์ตœ์ ์˜ ์†”๋ฃจ์…˜์ธ ์ „์ฒด ๊ฒฝ๋กœ์˜ ๋ถ€๋ถ„ ๊ฒฝ๋กœ ์—ญ์‹œ ์ค‘๊ฐ„์— ์ตœ๋‹จ ๊ฒฝ๋กœ๋กœ ์„ ํƒ๋˜์–ด ์ด๋ฏธ ํ…Œ์ด๋ธ” ์–ด๋”˜๊ฐ€์— ๊ฐ’์œผ๋กœ ์ž๋ฆฌ ์žก๊ณ  ์žˆ๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฒฐ๊ตญ์—” ๋ถ€๋ถ„ ์ง‘ํ•ฉ์˜ ํ•ฉ์œผ๋กœ ์ „์ฒด ์ตœ์  ์†”๋ฃจ์…˜์ธ ๊ฒฝ๋กœ๋ฅผ ๋„์ถœํ•ด๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ ๋ คํ•˜๊ธฐ ์œ„ํ•ด DP Table์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค.

""" Floyd-Warshall Implementation """

import sys
from typing import List
"""
[Floyd-Warshall]
1) DP Table init
2) triple-loop
    - dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j])
3) print result
"""
N = int(sys.stdin.readline())  # ๋…ธ๋“œ ๊ฐœ์ˆ˜
M = int(sys.stdin.readline())  # ๊ฐ„์„  ๊ฐœ์ˆ˜
dp = [[float('inf')] * (N+1) for _ in range(N+1)]

# 1) DP Table init
for i in range(1, N+1):
    dp[i][i] = 0

for _ in range(M):
    src, end, cost = map(int, sys.stdin.readline().split())
    dp[src][end] = cost

# 2) triple-loop
for k in range(1, N+1):
    for i in range(1, N+1):
        for j in range(1, N+1):
            if i == j:
                continue
            dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j])

# 3) print result
for i in range(1, N+1):
    for j in range(1, N+1):
        if dp[i][j] == float('inf'):
            print('INF', end=' ')
        else:
            print(dp[i][j], end=' ')
    print()

Leave a comment