본문 바로가기
알고리즘창고

[코드조각] 플로이드-워셜

by 야호호코코 2021. 6. 11.
반응형

 플로이드-워셜 알고리즘은 그래프 간의 모든 정점에서 다른 정점까지의 최단거리를 쉽게 구하는 알고리즘이다.

 모든 정점과 정점 사이의 최단거리가 필요하거나, 키 비교, 줄 세우기 등의 문제에서 사용할 수 있다.

import math

N = int(input()) #정점의 개수
M = int(input()) #입력할 간선 정보의 개수

#정점과 정점사이의 거리. d[i][j]는 노드 i에서 노드 j까지의 거리
d = [[math.inf for i in range(N)] for j in range(N)]

#자기 자신부터 자기 자신의 거리가 0
for i in range(N):
	d[i][i] = 0

#간선 정보 입력
while M:
    # 출발지점, 끝지점, 비용
    S, E, C = map(int, input().split())    
    d[S][E] = min(d[S][E], C)

#플로이드-워셜
for m in range(N):
    for i in range(N):
        for j in range(N):
            if d[i][j] > d[i][m] + d[m][j]:
                d[i][j] = d[i][m] + d[m][j]:

for i in d:
    print(*i)

 최단거리를 구하는 방식은 초기에 모든 노드간 거리가 있는 배열을 생성하고, 노드A와 B의 거리보다, 노드A에서 M을 거쳐 B로 가는 것이 더 짧다면, 그것으로 거리를 갱신하는 것이다. 

 시간복잡도는 O(N^3)이다. 코드는 최단거리 구하기 중에서 제일 간단하지만, 시간복잡도가 매우높아 데이터가 적은 문제에서 유리하다.

 

반응형

'알고리즘창고' 카테고리의 다른 글

[코드조각] union-find (분리집합)  (0) 2021.09.13
[코드조각] 다익스트라  (0) 2021.05.07
[C] 보고 정렬 (bogo sort, stupid sort)  (0) 2018.07.13