๋ฐ์ํ
๐ ํ๋ก์ด๋ ์์ฌ(Floyd Warshall) ๋
ํ๋ก์ด๋-์์ ์๊ณ ๋ฆฌ์ฆ(Floyd-Warshall Algorithm)์ ๊ทธ๋ํ์์ ๋ชจ๋ ๊ผญ์ง์ ์ฌ์ด์ ์ต๋จ ๊ฒฝ๋ก์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์์ ๊ฐ์ค์น๋ฅผ ๊ฐ๋ ๊ฐ์ ๋ ์ํ๋ง ์๋ค๋ฉด ์ ์ฒ๋ฆฌ๋๋ค. ์ ์ผ ๋ฐ๊นฅ์ชฝ ๋ฐ๋ณต๋ฌธ์ ๊ฑฐ์ณ๊ฐ๋ ๊ผญ์ง์ ์ด๊ณ , ๋ ๋ฒ์งธ ๋ฐ๋ณต๋ฌธ์ ์ถ๋ฐํ๋ ๊ผญ์ง์ , ์ธ ๋ฒ์งธ ๋ฐ๋ณต๋ฌธ์ ๋์ฐฉํ๋ ๊ผญ์ง์ ์ด๋ค. ์ด ์๊ณ ๋ฆฌ์ฆ์ ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ๋ ์๋ ค์ ธ ์๋ค. ( ์ถ์ฒ: ์ํค๋ฐฑ๊ณผ )
- ๋ชจ๋ ์ ์ ์์ ๋ชจ๋ ์ ์ ์ผ๋ก์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๊ฒ!
- ๊ฑฐ์ณ๊ฐ๋ ์ ์ ์ ๊ธฐ์ค์ผ๋ก ๊ตฌํ๋ค.
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์ ์ด์ฉ
- ๋ค์ต์คํธ๋ผ์ ๊ฒฝ์ฐ ํ ์ ์ ์์ ๋ชจ๋ ์ ์ ๊น์ง ์ ์ต๋จ ๊ฒฝ๋ก
- ๋ฐ๋ณต๋ฌธ์ด 3๊ฐ์ด๋ฏ๋ก ์๊ฐ๋ณต์ก๋๋ O(N^3) ์ด๋ค. ํ์ง๋ง ์ฝ๋๋ ๋งค์ฐ ๊ฐ๋จํ๋ค.
๐ ํ๋ก์ด๋ ์์ฌ(Floyd Warshall) ๊ตฌํ
- ๊ฐ์ค์น ์ธ์ ํ๋ ฌ์ ๋ง๋ ๋ค.
- i ์์ j ๋ก ๊ฐ ๋์ ๊ฐ์ค์น์ด๋ค.
- inf๋ ๋ฌดํ๋๋ผ๋ ๋ป์ผ๋ก i ์ j๊ฐ ๋ฐ๋ก ์ด์ด์ ธ ์์ง ์๋ค๋ ์๋ฏธ
- ์ด์ ๊ฑฐ์ณ๊ฐ๋ ์ ์ ์ ๊ธฐ์ค์ผ๋ก ์ธ์ ํ๋ ฌ์ ๊ฐฑ์ ํ๋ค.
- i ์์ k๋ฅผ ๊ฑฐ์ณ j๋ก ๊ฐ๋ ๊ฒ๊ณผ i ์์ ๋ฐ๋ก j๋ก ๊ฐ๋๊ฒ
adj[i][k] + adj[k][j] ์ adj[i][j] ๋ฅผ ๋น๊ต - ๋ ์ค ์์๊ฒ์ผ๋ก ์ธ์ ํ๋ ฌ์ ๊ฐฑ์ ํ๋ค.
- ๋ชจ๋ ์ ์ ์ ๋ํด์ ํํ๋ฏ๋ก 3์ค ํฌ๋ฌธ์ ์ฌ์ฉ
- ๊ฒฐ๊ณผ ๊ฐ์ ์๋์ ๊ฐ๋ค
# ๊ฐ์ค์น ์ธ์ ํ๋ ฌ # ๋ฐ๋ก ์ฐ๊ฒฐ์ด ์๋ผ์๋ ๊ฒฝ์ฐ INF(๋ฌดํ๋)
N = 4
INF = float('inf')
adj = [
[0, 5, INF, 8],
[7, 0, 9, INF],
[2, INF, 0, 4],
[INF, INF, 3, 0]
]
print('๊ฐ์ค์น ์ธ์ ํ๋ ฌ')
for row in adj:
print(row)
print()
# ๊ฑฐ์ณ๊ฐ๋ ์ ์ k๋ฅผ ๊ธฐ์ค์ผ๋ก
for k in range(N):
# ์ถ๋ฐ ์ ์ i ์์
for i in range(N):
# ๋์ฐฉ ์ ์ j ๊น์ง
for j in range(N):
# i์์ k๋ฅผ ๊ฑฐ์ณ j ๊น์ง ๊ฐ๋ ๊ฒ๊ณผ i์์ j๊น์ง ๋ฐ๋ก๊ฐ๋ ๊ฒ์ค ๊ฐ์ด ๋ ์์ ๊ฒ์ผ๋ก ๊ฐฑ์
adj[i][j] = min(adj[i][k] + adj[k][j], adj[i][j])
print('๊ฒฐ๊ณผ')
for row in adj:
print(row)
print()
๋ฐ์ํ
'CS > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ ์ ๋ ฌ(heap sort) (0) | 2020.10.06 |
---|---|
์์ ์ ๋ ฌ(topology sort) (0) | 2020.10.05 |
์๋ผํ ์คํ ๋ค์ค์ ์ฒด(Sieve Of Eratosthenes) (0) | 2020.10.03 |
๋ค์ต์คํธ๋ผ(dijkstra) (0) | 2020.10.02 |
๋ค์ด๋๋ฏนํ๋ก๊ทธ๋๋ฐ(Dynamic Programming) (0) | 2020.10.01 |