Notice
Recent Posts
Recent Comments
Link
HwangHub
[다익스트라] 백준 1753. 최단경로 본문
1753번: 최단경로
첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가
www.acmicpc.net
문제 해석
위 문제는 전형적인 다익스트라 문제이다. 시작점을 지정하고, 유향 그래프에서 최단 경로를 찾는 문제이니, 다익스트라 정의를 공부하는 문제라고 봐도 무방하다.
풀이 코드
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**5)
import heapq
# 노드 개수 n, 엣지 갯수 m
n, m = map(int,input().split())
# 시작 노드 번호
start = int(input())
# 무한 INF, infinite
INF = int(1e9)
# 그래프 초기화
graph = [[] * (n+1) for _ in range(n+1)]
# 최단 거리 테이블 모두 무한으로 초기화
distance = [INF] * (n+1)
# 엣지를 그래프에 입력
for _ in range(m):
a, b, c = map(int, input().split()) # a -> b, c는 cost
graph[a].append((b, c)) # 다익스트라는 유향 그래프
def dijkstra(start):
q = []
# 시작 노드로 가기 위한 최단 경로는 0으로 설정하여 큐에 삽입
heapq.heappush(q, (0, start))
distance[start] = 0
while q:
# 최단 거리가 짧은 노드에 대한 정보 꺼내기 (by 최소 힙)
dist, now = heapq.heappop(q)
# 현재 노드가 이미 처리된 노드라면 무시
if distance[now] < dist: continue
# 현재 노드와 연결된 다른 인접 노드 확인
for i in graph[now]:
cost = dist + i[1]
# 현재 노드를 거쳐서, 다른 노드로 이동하는 거리가 더 짧은 경우
if cost < distance[i[0]]:
distance[i[0]] = cost
heapq.heappush(q, (cost, i[0]))
dijkstra(start)
for i in range(1, n+1):
if distance[i] == INF:
print("INF")
else:
print(distance[i])
'workspace > 알고리즘' 카테고리의 다른 글
자바로 풀 수 없는 문제 (0) | 2023.05.30 |
---|---|
[다익스트라] 백준 1446. 지름길 (0) | 2023.05.20 |
[DFS/BFS] 백준 11724. 연결 요소의 개수 (0) | 2023.05.17 |
[DFS] 백준 13023. ABCDE (0) | 2023.05.17 |
[BFS] 2644 촌수 계산 (1) | 2023.05.12 |
Comments