๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด/Shortest Path

Floyd-Warshall ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„(python)

by syLim___ 2023. 2. 28.
728x90

Floyd-Warshall ์•Œ๊ณ ๋ฆฌ์ฆ˜

 -์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

 -๋งค ๋‹จ๊ณ„๋งˆ๋‹ค ๊ฑฐ์ณ๊ฐ€๋Š” ๋…ธ๋“œ k๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค

 -์ฆ‰, a->b๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ์™€ k๋ฅผ ๊ฑฐ์ณ ๊ฐ€๋Š” a->k->b์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๋น„๊ตํ•˜์—ฌ ํ…Œ์ด๋ธ”์„ ๊ฐฑ์‹ ํ•œ๋‹ค.

 -2์ฐจ์› ํ…Œ์ด๋ธ”์— ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค (dp์ž„)


๊ตฌํ˜„ ๋ฐฉ๋ฒ•

 1) ์ตœ๋‹จ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. (๊ฐ ๋…ธ๋“œ์—์„œ ์ธ์ ‘ํ•œ ๋‹ค์Œ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋ฐ ๋“œ๋Š” ๋น„์šฉ์„ ๊ธฐ๋ก)

 2) ๊ฐ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๊ฐ€๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜๋ฉฐ ํ…Œ์ด๋ธ”์„ ๊ฐฑ์‹ ํ•œ๋‹ค.


ํŒŒ์ด์ฌ ์ฝ”๋“œ

import sys
input = sys.stdin.readline
INF = int(1e9) #๋งค์šฐ ํฐ ์ˆซ์ž์ธ 10์–ต์„ ๋ฌดํ•œ๋Œ€๋กœ ์ •์˜ํ•œ๋‹ค

#n(๋…ธ๋“œ ์ˆ˜), m(๊ฐ„์„  ์ˆ˜) ์ž…๋ ฅ๋ฐ›๊ธฐ
n,m = map(int,input().split())

#์ตœ๋‹จ๊ฑฐ๋ฆฌ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ๋ฆฌ์ŠคํŠธ (์ดˆ๊ธฐ๊ฐ’์€ ์ „๋ถ€ ๋ฌดํ•œ๋Œ€๋กœ ์ดˆ๊ธฐํ™”)
graph = [[INF]*(n+1) for _ in range(n+1)]

#์ž๊ธฐ์ž์‹  -> ์ž๊ธฐ์ž์‹ ์œผ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์€ 0์ด๋ฏ€๋กœ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค
for i in range(1,n+1):
	for j in range(1,n+1):
    	if i==j:
        	graph[i][j]=0
            
 #๊ฐ„์„  ์ •๋ณด ์ž…๋ ฅ๋ฐ›๊ธฐ (a์—์„œ b ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์ด c)
for _ in range(m):
	a,b,c = map(int, input().split())
   	graph[a][b]=c
    
#Floyd-Warshall ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰
for k in range(1,n+1):	#๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ k๋ฅผ ๊ฑฐ์ณ๊ฐˆ๋•Œ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐ
	for i in range(1,n+1):
    	for j in rnage(1,n+1):
        	graph[a][b] = min(graph[a][b], graph[a][k]+graph[k][b])
      
#๊ฐ ๋…ธ๋“œ๋ณ„๋กœ ์ตœ๋‹จ๊ฒฝ๋กœ ์ถœ๋ ฅ
for i in range(1,n+1):
	for j in range(1,n+1):
    	if graph[i][j]==INF:
        	print("๋„๋‹ฌํ•  ์ˆ˜ ์—†์Œ",end=' ')
        else:
        	print(graph[a][b],end=' ')
        print()
728x90