📝 Study Notes/Algorithm

플로이드 와샬 알고리즘 (Python)

lazyArtisan 2024. 7. 23. 23:45

삼중 for문으로 모든 정점을 순회하면서
"나 거쳐서 갈 수 있는 놈들 있어? 싹 다 갱신해봐"

가 플로이드 와샬 알고리즘이다.

 

이행적 폐쇄 (Transitive Closure)

비용 상관없이 갈 수 있느냐 없느냐만 따져보면

for k in range(n):  # 나 A를 거쳐서
    for i in range(n):  # B 너가
        for j in range(n):  # C로 갈 수 있니?
            if closure[i][k] and closure[k][j]:
                closure[i][j] = True

 

첫번째 for문 요소 : "나 A를 거쳐서"
두번째 for문 요소 : "B 너가"
세번째 for문 요소 : "C로 갈 수 있니?"

"나 A를 거쳐서, B 너가, C로 갈 수 있니?"

 

최소 비용 (Floyd-Warshall Algorithm)

최소 비용 버전으로 보면

for k in range(n):  # 나 A를 거쳐서 가는게
    for i in range(n):  # B 너가
        for j in range(n):  # C로 갈 때 더 빨리 가니?
            if dist[i][j] > dist[i][k] + dist[k][j]:
                dist[i][j] = dist[i][k] + dist[k][j]

 

첫번째 for문 요소 : "나 A를 거쳐서 가는게"
두번째 for문 요소 : "B 너가"
세번째 for문 요소 : "C로 갈 때 더 빨리 가니?"

"나 A를 거쳐서 가는게, B 너가, C로 갈 때 더 빨리 가니?"