이호진
최단 경로 알고리즘 - 플로이드-워셜 - 2021/04/03 본문
플로이드 워셜 알고리즘
플로이드 워셜 알고리즘은 모든 노드에서 다른 모든 노드까지의 최단 경로를 구할 때 이용한다
3차원 리스트를 이용하기 때문에 노드의 개수가 많을 땐 사용하기 힘들다.
점화식으로는 Dab=min(Dab,Dak+Dkb)로 나타 낼 수 있다. -> 동적 프로그래밍
import sys
input = sys.stdin.readline
n = int(input())
m = int(input())
INF = int(1e9)
graph = [[INF] * (n + 1) for i in range(n + 1)]
#이차원 리스트로 graph를 선언한다.
for i in range(1, n + 1):
for j in range(1, n + 1):
if i == j:
graph[i][j] = 0
#자기 자신으로의 거리를 0으로 초기화한다.
for i in range(m):
a, b, c = map(int, input().split())
graph[a][b] = c
#a에서 b로 가는 경우의 비용은 c
for k in range(1, n + 1):
for i in range(1, n + 1):
for j in range(1, n + 1):
graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j])
#점화식을 이용해서 매 상황마다 값을 갱신한다.
for i in range(1, n + 1):
for j in range(1, n + 1):
if graph[i][j] == INF:
print(0, end=' ')
else:
print(graph[i][j], end=' ')
print()
#행렬의 형태로 출력
'주요 알고리즘' 카테고리의 다른 글
그래프 관련 알고리즘 - 다익스트라, 플로이드-워셜, 크루스칼 - 2021/05/06 (0) | 2021.05.06 |
---|---|
최단 경로 알고리즘 - 다익스트라 - 2021/04/02 (0) | 2021.04.02 |
다익스트라 알고리즘 - 2021/03/22 (0) | 2021.03.22 |
크루스칼 알고리즘 - 2021/03/16 (0) | 2021.03.16 |
음료수 얼려먹기 - DFS (2021/02/22) (0) | 2021.02.22 |