-
[백준] 1753번 최단경로Algorithm Study/Python 2021. 7. 4. 13:47
https://www.acmicpc.net/problem/1753
1753번: 최단경로
첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1≤V≤20,000, 1≤E≤300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1≤K≤V)가 주어진다.
www.acmicpc.net
문제
방향그래프가 주어지면 주어진 시작점에서 다른 모든 정점으로의 최단 경로를 구하는 프로그램을 작성하시오. 단, 모든 간선의 가중치는 10 이하의 자연수이다.
입력
첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1≤V≤20,000, 1≤E≤300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1≤K≤V)가 주어진다. 셋째 줄부터 E개의 줄에 걸쳐 각 간선을 나타내는 세 개의 정수 (u, v, w)가 순서대로 주어진다. 이는 u에서 v로 가는 가중치 w인 간선이 존재한다는 뜻이다. u와 v는 서로 다르며 w는 10 이하의 자연수이다. 서로 다른 두 정점 사이에 여러 개의 간선이 존재할 수도 있음에 유의한다.
출력
첫째 줄부터 V개의 줄에 걸쳐, i번째 줄에 i번 정점으로의 최단 경로의 경로값을 출력한다. 시작점 자신은 0으로 출력하고, 경로가 존재하지 않는 경우에는 INF를 출력하면 된다.
풀이
시작점부터 각 정점까지의 최소거리를 구하는 문제이다.
다익스트라 알고리즘을 이용하여 현재까지 알고 있는 최단거리를 계속 갱신하면서 구현하였다.for i in range(E): start, end, weight = map(int, sys.stdin.readline().split()) board[start].append((end, weight))
입력으로부터 시작, 도착, 가중치를 입력받아 리스트에 저장한다.
시작점이 index일때 갈 수 있는 정점과 비용을 나타내기 위해서이다.dist = [float("INF") for _ in range(V+1)] heap = []
dist 리스트는 각 정점까지의 거리를 나타내기 위해 생성한다.
각 정점까지의 초기값을 INF로 설정하고 우선순위 큐를 사용하기 위하여 heap을 생성하였다.def dijkstra(start): dist[start] = 0 heapq.heappush(heap, (0, start))
나 자식으로 도착하는 최소 비용은 0이기 때문에 0으로 설정하고 시작점을 heap에 넣는다.
while heap: distance, now = heapq.heappop(heap) if dist[now] < distance: continue
heap이 있는 동안 heap에 있는 값을 하나씩 꺼내서 확인한다.
가중치가 낮은 순서대로 먼저 탐색한다.
heap에서 나온 값이 dist에 입력되어 있는 값보다 더 큰 경우는 최단거리가 아니기 때문에 무시한다.for next_node, w in board[now]: next_distance = w + distance if next_distance < dist[next_node]: dist[next_node] = next_distance heapq.heappush(heap, (next_distance, next_node))
heap에서 꺼낸 정점에서 갈 수 있는 모든 정점에 대하여
지금까지 거리(now) + 현재 정점에서 다른 정점까지 거리(w)를 더해서
다음 정점까지의 거리보다 작으면 갱신하고 heap에 추가한다.전체 코드
import sys import heapq V, E = map(int, sys.stdin.readline().split()) start_v = int(sys.stdin.readline().strip()) board = [[] for _ in range(V + 1)] dist = [float("INF") for _ in range(V+1)] heap = [] for i in range(E): start, end, weight = map(int, sys.stdin.readline().split()) board[start].append((end, weight)) def dijkstra(start): dist[start] = 0 heapq.heappush(heap, (0, start)) while heap: distance, now = heapq.heappop(heap) if dist[now] < distance: continue for next_node, w in board[now]: next_distance = w + distance if next_distance < dist[next_node]: dist[next_node] = next_distance heapq.heappush(heap, (next_distance, next_node)) dijkstra(start_v) for i in range(1, V+1): print("INF" if dist[i] == float("INF") else dist[i])
전형적인 다익스트라를 연습해볼 수 있는 문제였다.
'Algorithm Study > Python' 카테고리의 다른 글
[프로그래머스] 2021 카카오 채용연계형 인턴십 02.거리두기 확인하기 (0) 2021.07.21 [프로그래머스] 2021 카카오 채용연계형 인턴십 01.숫자 문자열과 영단어 (0) 2021.07.21 [백준] 13302번 리조트 (0) 2021.07.04 [백준] 11497번 통나무 건너뛰기 (0) 2021.06.28 [백준] 17390번 이건 꼭 풀어야해! (0) 2021.06.28