CS/Algorithm
                
              ํ๋ก์ด๋ ์์ฌ(Floyd Warshall)
                deo2kim
                 2020. 10. 4. 20:51
              
              
                    
        ๋ฐ์ํ
    
    
    
  
๐ ํ๋ก์ด๋ ์์ฌ(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()
๋ฐ์ํ
    
    
    
  