Study/BOJ

[BOJ] 11404. 플로이드

MuviSsum 2021. 7. 18. 17:54

www.acmicpc.net/problem/11404

 

11404번: 플로이드

첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가

www.acmicpc.net

 

문제: 모든 도시에 대해서 도시 A에서 B로 가는데 필요한 비용의 최솟값을 구하라.

 

문제 이해하기!!

모든 도시로 가는 최소 비용을 구하면 되는 문제입니다.

한 루트의 최소비용을 구할 때는 다익스트라를 쓰지만,

모든 곳의 최소비용을 구할 때는 플로이드 와샬을 쓰면 됩니다.

다만 주의할 점은 정점의 갯수 ** 3 이므로 정점의 갯수가 작을 때 쓸 수 있습니다.

 

그래서 푼 방법은

1. 처음 받는 루트와 비용을 최소값으로 2차원 배열에 넣어 줍니다.

2. 3중 for문을 사용하여 시작, 환승, 도착 지점을 활용하여 해당 지점의 최소 비용을 찾아줍니다.

3. 갈 수 없는 곳은 0으로 표시하여 주고 출력합니다.

 

마지막 0으로 표시하는 부분을 빠뜨리면 틀릴 수 있으니까 조심하시면 됩니다!

(내가 저걸로.. 2번이나 틀렸다고... ㅠㅠ)

 

코드:

from collections import defaultdict
from heapq import *
from sys import stdin
input = stdin.readline


N = int(input())
M = int(input())
ans = [[float("inf")] * N for _ in range(N)]

for _ in range(M):
    start, end, cost = map(int, input().split())
    ans[start-1][end-1] = min(ans[start-1][end-1], cost)

for _ in range(N):
    ans[_][_] = 0

for i in range(N):
    for j in range(N):
        for k in range(N):
            ans[j][k] = min(ans[j][i] + ans[i][k], ans[j][k])

for i in range(N):
    for j in range(N):
        if ans[i][j] == float('inf'):
            ans[i][j] = 0

for i in range(N):
    print(*ans[i])
반응형

'Study > BOJ' 카테고리의 다른 글

[BOJ] 1655. 가운데를 말해요  (0) 2021.11.02
[BOJ] 2096. 내려가기  (0) 2021.07.29
[BOJ] 1967. 트리의 지름  (0) 2021.07.18
[BOJ] 1167. 트리의 지름  (0) 2021.07.18
[BOJ] 7662. 이중 우선순위 큐  (0) 2021.07.07