๐๏ธ Graph Theory 3: Floyd-Warshall
๐ 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