티스토리 뷰

반응형

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

 


⊙ 문제

⊙ 입력

⊙ 출력

⊙ 예제 입출력

⊙ 알고리즘 분류

  • 그래프 이론
  • 다익스트라

 


 

⊙ 문제 접근 과정

 

최단거리를 구하는 알고리즘 중 다익스트라를 사용해 문제를 풀었다.

다익스트라 함수를 만들 때, 시작값만 입력해주면 돌아가게끔 설계했다.

 

깔끔하게 3파트로 나누어 풀었다.

 

다익스트라 구현부, 입력부, 출력부

 

 

 


 

⊙ 문제 풀이

 

import sys
from heapq import heappush, heappop

input = sys.stdin.readline
INF = 1e9

# 다익스트라
def dijkstra(K):
    dp[K-1] = 0
    heappush(heap, [0, K-1])
    while heap:
        cost, pos = heappop(heap)
        for p, c in graph[pos]:
            c += cost
            if c < dp[p]:
                dp[p] = c
                heappush(heap, [c, p])


# 입력
V, E = map(int, input().split())
K = int(input())
graph = [[] for _ in range(V)]
dp = [INF]*V
heap = []
for _ in range(E):
    u, v, w = map(int, input().split())
    graph[u-1].append([v-1, w])

dijkstra(K)

# 출력
for i in range(V):
    print("INF" if dp[i] == INF else dp[i])

 


⊙ 결과

 


⊙ 마무리

 

 

NONE

 

 

좋아요는 로그인하지 않아도 누를 수 있습니다!

728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함