본문 바로가기
Algorithm/Baekjoon

1719. 택배 (Python)

by 원만사 2022. 6. 24.
반응형
 

1719번: 택배

명우기업은 2008년부터 택배 사업을 새로이 시작하기로 하였다. 우선 택배 화물을 모아서 처리하는 집하장을 몇 개 마련했지만, 택배 화물이 각 집하장들 사이를 오갈 때 어떤 경로를 거쳐야 하

www.acmicpc.net

 

풀이

 플로이드 워셜 알고리즘을 사용하여 해결할 수 있다. 기존의 플로이드 워셜 알고리즘에서 최단거리를 기록하는 graph 배열에 첫 번째로 방문하는 집하장 정보를 추가한다. i에서 j로 가는 경로가 k 집하장을 거쳐서 가는 경로의 길이로 갱신될 때 graph[i][k]에 기록되어 있는 첫 번째로 방문하는 집하장 정보를 graph[i][j]에 기록해주면 된다.

 

코드

import sys
input = sys.stdin.readline
INF = float('inf')


if __name__ == '__main__':
    N, M = map(int, input().split())
    # graph[i][j] -> [i에서 j로 가는 최단경로의 길이, i에서 j로 갈 때 처음으로 가는 집하장]
    # 길이는 INF로, 처음 가는 집하장 정보는 자기 자신으로 초기화
    graph = [[[INF, i] for i in range(N + 1)] for _ in range(N + 1)]

    for _ in range(M):  # 경로 입력
        a, b, time = map(int, input().split())
        graph[a][b][0] = time
        graph[b][a][0] = time

    # 자기 자신으로 가는 경로의 길이는 0으로 초기화
    for i in range(1, N + 1):
        graph[i][i][0] = 0

    # 플로이드 워셜 알고리즘
    for k in range(1, N+1):
        for i in range(1, N+1):
            for j in range(1, N+1):
                # k를 거쳐가는 경로로 갱신될 때, 처음 거치는 집하장 정보를 갱신해준다.
                if graph[i][j][0] > graph[i][k][0] + graph[k][j][0]:
                    graph[i][j][0] = graph[i][k][0] + graph[k][j][0]
                    graph[i][j][1] = graph[i][k][1]

    for i in range(1, N+1):
        for j in range(1, N+1):
            if i == j:
                print('-', end=' ')
            else:
                print(graph[i][j][1], end=' ')
        print()
반응형

'Algorithm > Baekjoon' 카테고리의 다른 글

4386. 별자리 만들기 (Python)  (0) 2022.06.27
4803. 트리 (Python)  (0) 2022.06.26
16398. 행성 연결 (Python)  (0) 2022.06.23
2342. Dance Dance Revolution (Python)  (0) 2022.06.20
9252. LCS 2 (Python)  (0) 2022.06.20

댓글