플로이드 워셜(Floyd-Warshall) 알고리즘은 그래프에서 모든 정점 쌍 사이의 최단 경로를 구하는 알고리즘이다.
알고리즘은 다음과 같은 과정으로 이루어진다:
플로이드 워셜 알고리즘은 시간 복잡도 O(n^3)으로, 그래프의 크기가 작을 때 유용하게 사용될 수 있다.
def floyd_warshall(graph):
n = len(graph)
dist = [[float('inf')] * n for _ in range(n)]
for i in range(n):
for j in range(n):
if graph[i][j]:
dist[i][j] = graph[i][j]
for k in range(n): # 0~N까지 한개씩 집음
for i in range(n):# 0~N노드중 k노드로 연결된걸 찾음
for j in range(n):# K노드에서 0~N노드중 연결된걸 찾음
if dist[i][j] > dist[i][k] + dist[k][j]: # 만약 i 노드와 k가 연결 돼 있고 k노드와 j노드가 연결 돼 있다면 & i -> k -> j의 경로가 원래 i -> j의 경로보다 짧다면
dist[i][j] = dist[i][k] + dist[k][j] # i노드와 j 노드도 연결 된 것
# 최단거리 갱신
return dist
반복문 순서로 거쳐가는 노드가 제일 밖에 있어야 모든 노드 탐색이 되니 꼭 명심.
예시 문제
1번.