항로 운임표
문제
한 해운 회사는 항구 n곳을 오가는 화물 항로를 운영한다. 항구에는 1번부터 n번까지 번호가 붙어 있다.
항로는 모두 m개다. 각 항로마다 출발 항구와 도착 항구, 그리고 그 항로를 한 번 쓸 때 드는 운임이 정해져 있다. 항로는 한쪽 방향으로만 운항한다. A번 항구에서 B번 항구로 가는 항로가 있다고 해서 B번 항구에서 A번 항구로 가는 항로도 있는 것은 아니다.
같은 두 항구를 잇는 항로가 여러 개일 수도 있다. 이 경우 항로마다 운임이 다를 수 있으므로 그 가운데 어느 것을 골라 써도 된다.
화물은 중간 항구를 몇 군데든 거쳐 갈 수 있다. 어떤 항구에서 다른 항구로 화물을 보낼 때 드는 운임은 거쳐 간 모든 항로의 운임을 더한 값이다. 회사는 항구마다 다른 모든 항구로 화물을 보낼 때 드는 운임의 최솟값을 적은 표를 만들려고 한다.
모든 항구 쌍에 대하여 A번 항구에서 B번 항구로 화물을 보내는 데 드는 운임의 최솟값을 계산하는 프로그램을 작성하여라. A번 항구에서 B번 항구로 가는 길이 아예 없다면 그 자리에는 0을 적는다. 또한 A와 B가 같은 항구인 자리에도 0을 적는다.
예를 들어 n=5, m=8인 상황을 가정하자. 각 항로에 대한 정보가 다음의 표와 같다고 해보자.
| 항로 번호 | 1번 | 2번 | 3번 | 4번 | 5번 | 6번 | 7번 | 8번 |
|---|---|---|---|---|---|---|---|---|
| 출발 항구 | 5 | 1 | 4 | 1 | 1 | 4 | 4 | 1 |
| 도착 항구 | 3 | 3 | 1 | 4 | 5 | 2 | 1 | 4 |
| 운임 | 29349 | 88309 | 654 | 49215 | 27284 | 72425 | 85234 | 43709 |
3번 항로와 7번 항로는 둘 다 4번 항구에서 1번 항구로 가는 항로인데 운임이 654와 85234다. 이때는 더 싼 654를 쓰면 된다. 4번 항로와 8번 항로도 마찬가지로 둘 다 1번 항구에서 4번 항구로 가며, 더 싼 43709를 쓰면 된다.
2번 항구와 3번 항구에서 출발하는 항로는 하나도 없다. 그래서 두 항구에서는 다른 어떤 항구로도 화물을 보낼 수 없다.
현재 예시에서 모든 항구 쌍에 대한 운임의 최솟값을 표로 정리하면 다음과 같다.
| 출발 항구 | 1번으로 | 2번으로 | 3번으로 | 4번으로 | 5번으로 |
|---|---|---|---|---|---|
| 1번 | 0 | 116134 | 56633 | 43709 | 27284 |
| 2번 | 0 | 0 | 0 | 0 | 0 |
| 3번 | 0 | 0 | 0 | 0 | 0 |
| 4번 | 654 | 72425 | 57287 | 0 | 27938 |
| 5번 | 0 | 0 | 29349 | 0 | 0 |
표에서 몇 자리를 짚어 보자. 1번 항구에서 3번 항구로 바로 가는 2번 항로의 운임은 88309다. 그런데 1번 항구에서 5번 항구로 가는 27284를 쓰고 이어서 5번 항구에서 3번 항구로 가는 29349를 쓰면 합이 56633이므로 이쪽이 더 싸다. 1번 항구에서 2번 항구로 가는 길은 4번 항구를 거치는 것뿐이며 43709와 72425를 더한 116134다.
입출력 예시
예시 1
입력
5 8 5 3 29349 1 3 88309 4 1 654 1 4 49215 1 5 27284 4 2 72425 4 1 85234 1 4 43709
출력
0 116134 56633 43709 27284 0 0 0 0 0 0 0 0 0 0 654 72425 57287 0 27938 0 0 29349 0 0
예시 2
입력
3 3 2 3 82322 2 3 40264 2 3 18432
출력
0 0 0 0 0 18432 0 0 0
예시 3
입력
1 0
출력
0
입력 조건
가장 먼저 첫째 줄에 항구의 수 n이 주어진다. n은 1 이상 100 이하의 자연수다.
이어서 둘째 줄에 항로의 수 m이 주어진다. m은 0 이상 100,000 이하의 정수다.
이어서 m개의 줄에 걸쳐 각 항로에 대한 정보가 주어진다. 한 줄에는 출발 항구의 번호 A와 도착 항구의 번호 B, 그리고 운임 C가 공백으로 구분되어 주어진다. A와 B는 1 이상 n 이하의 서로 다른 자연수이며, C는 1 이상 100,000 이하의 자연수다. m이 0이면 이 줄은 하나도 주어지지 않는다.
출력 조건
n개의 줄을 출력한다. A번째 줄에는 A번 항구에서 1번 항구, 2번 항구, 차례로 n번 항구까지 화물을 보낼 때 드는 운임의 최솟값을 공백으로 구분하여 차례대로 출력한다. A번 항구에서 B번 항구로 가는 길이 없는 자리에는 0을 출력하고, A와 B가 같은 자리에도 0을 출력한다.
이때 각 수 뒤에 공백을 하나 붙여서 출력한다. 그래서 줄의 마지막 수 뒤에도 공백이 하나 남는다. 줄의 끝마다 공백이 하나씩 남는 모양으로 출력해야 한다.
요구사항
- 항로는 한쪽 방향으로만 운항합니다
- 같은 두 항구를 잇는 항로가 여러 개일 수 있습니다. 그중 가장 싼 것을 씁니다
- 거쳐 가는 항구의 수에는 제한이 없습니다
- 길이 없는 자리와 같은 항구끼리의 자리에는 0을 적습니다
- 각 수 뒤에 공백을 하나 붙입니다. 줄의 마지막 수 뒤에도 공백이 하나 남습니다
- 표준 입력으로 읽고 표준 출력으로 내보내는 프로그램을 짜야 합니다
- 쓸 수 있는 말은 파이썬, 자바스크립트입니다
- 메모리 제한은 256MB입니다. 브라우저에서는 재지 않고 적기만 합니다
- 시간 제한은 출제자의 정답 코드를 같은 런타임에서 재서 정합니다
- 이 문제는 프롬프트가 아니라 코드를 냅니다. 그 코드는 이 기기의 브라우저에서 돌고, 서버로는 나온 출력의 지문과 걸린 시간만 갑니다. 맞았는지는 서버가 정합니다. 실행 시간은 각자 기기가 적어 보내는 값이라, 코드와 기기 정보를 순위표에 같이 내걸어 둡니다.
- 출력이 글자 하나까지 기대값과 같아야 합니다. 줄 안의 빈칸은 다른 글자와 똑같이 봅니다.
- 케이스는 15개이고, 그 가운데 3개는 입력과 기대 출력을 함께 보여 줍니다. 나머지는 제출할 때만 쓰이고 화면에는 보여 주지 않습니다.
- 케이스 15개를 전부 통과해야 해결입니다.
예시
공개 케이스 3개입니다. 채점에는 숨은 케이스가 함께 쓰입니다. 케이스 15개를 전부 통과해야 해결입니다.
1 0
0
3 3 2 3 82322 2 3 40264 2 3 18432
0 0 0 0 0 18432 0 0 0
5 8 5 3 29349 1 3 88309 4 1 654 1 4 49215 1 5 27284 4 2 72425 4 1 85234 1 4 43709
0 116134 56633 43709 27284 0 0 0 0 0 0 0 0 0 0 654 72425 57287 0 27938 0 0 29349 0 0
풀이
코드는 이 기기에서돕니다. 서버로는 나온 출력의 지문과 걸린 시간만 갑니다. 맞았는지는 서버가 정합니다.
제출은 로그인 하셔야 됩니다. 공개 케이스로 돌려보는 것은 로그인 없이도 됩니다.
공개 케이스 3개로 돌려보기가 됩니다. 제출하면 숨은 케이스까지 돕니다.
이 문제를 푼 사람
아직 없습니다. 첫 번째가 되실 수 있습니다.