[BOJ] 11404 플로이드
플로이드
해당 문제는 플로이드를 한번 풀어보는 문제이다.
플로이드에 대한 설명은 따로 포스팅 해두었다.
플로이드는 다이나믹 프로그래밍을 이용한 최단 경로 구하는 방법으로, 모든 정점에서 모든 정점으로의 최당경로를 전부 구할 수 있는 알고리즘이다. O(V^3)의 알고리즘을 갖는다.
음수 사이클이 발생한다면 구할 수 없다.
해당 문제에서 함정이 하나 있는데 두 정점 사이에는 여러 간선이 존재 할 수 있다는 점이다. 따라서 입력 받을 때, min(기존, 새로운 값) 을 이용하여 초기화 하면 간단하게 응용하여 구현할 수 있다.
코드는 아래와 같다.
import sys
INF = int(1e9)
def floyd(n):
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])
def solution(n, m):
for i in range(1, n + 1):
for j in range(1, n + 1):
if i == j:
graph[i][j] = 0
floyd(n)
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()
if __name__ == "__main__":
N = int(sys.stdin.readline().rstrip())
M = int(sys.stdin.readline().rstrip())
graph = [[INF] * (N + 1) for _ in range(N + 1)]
for _ in range(M):
a, b, cost = map(int, sys.stdin.readline().rstrip().split())
graph[a][b] = min(graph[a][b], cost)
solution(N, M)