cmod.ify

[1916] 최소비용 구하기 본문

BASIC/코딩테스트

[1916] 최소비용 구하기

modifyC 2026. 1. 22. 18:45
728x90
반응형

예시 데이터 상황

  • 노드 수(N): 5개 / 간선 수(M): 8개
  • 시작점: 1번 / 도착점: 5번
  • 초기 상태: dists = [0, inf, inf, inf, inf, inf] (1번 노드만 0)

단계별 동작 과정

1. 시작 단계 (노드 1)

우선순위 큐에서 (0, 1)을 꺼냄. 1번 노드와 연결된 인접 노드들을 확인하여 거리를 갱신함.

  • 1 → 2: 비용 2 (0+2 < inf) → dists[2] = 2
  • 1 → 3: 비용 3 (0+3 < inf) → dists[3] = 3
  • 1 → 4: 비용 1 (0+1 < inf) → dists[4] = 1
  • 1 → 5: 비용 10 (0+10 < inf) → dists[5] = 10
  • 큐 상태: [(1, 4), (2, 2), (3, 3), (10, 5)] (비용 순 정렬)

2. 최단 거리 노드 선택 (노드 4)

큐에서 가장 비용이 적은 (1, 4)를 꺼냄. 4번 노드를 거쳐 갈 수 있는 경로를 확인함.

  • 4 → 5: 비용 1(현재) + 3(가중치) = 4. 기존 dists[5]인 10보다 작으므로 갱신.
  • 결과: dists[5] = 4
  • 큐 상태: [(2, 2), (3, 3), (4, 5), (10, 5)]

3. 다음 최단 거리 선택 (노드 2)

큐에서 (2, 2)를 꺼냄. 2번 노드와 연결된 경로 확인.

  • 2 → 4: 비용 2 + 2 = 4. 현재 dists[4]는 1이므로 갱신하지 않음 (Pass).
  • 큐 상태: [(3, 3), (4, 5), (10, 5)]

4. 경로 확장 (노드 3)

큐에서 (3, 3)을 꺼냄. 3번 노드와 연결된 경로 확인.

  • 3 → 4: 비용 3 + 1 = 4. 현재 dists[4]는 1이므로 갱신 안 함.
  • 3 → 5: 비용 3 + 1 = 4. 현재 dists[5]가 4이므로 갱신 안 함 (이미 최단 거리 발견).
  • 큐 상태: [(4, 5), (10, 5)]

5. 목적지 확정 (노드 5)

큐에서 (4, 5)를 꺼냄. 이미 dists[5]가 4이므로 방문 처리됨. 그 뒤에 남아있던 (10, 5)는 if dists[cur] < dist: 조건에 의해 무시됨.


최종 결과

  • 최종 거리 테이블: [0, 0, 2, 3, 1, 4] (1번부터 5번까지 순서대로)
  • 1번에서 5번까지의 최소 비용: 4
import sys
import heapq

input = sys.stdin.readline

N = int(input())
M = int(input())
city = [[] for _ in range(N + 1)]

for _ in range(M):
    s, e, c = map(int, input().strip().split())
    city[s].append((e, c))

sn, en = map(int, input().strip().split())


def digk(start):
    dists = [sys.maxsize for _ in range(N + 1)]

    dists[start] = 0
    q = []
    # (비용, 노드)
    heapq.heappush(q, (0, start))

    while q:
        # 현재 가장 짧은 거리 노드 추출
        dist, cur = heapq.heappop(q)
        # 이미 방문 or 최단거리가 아니면 스킵
        if dists[cur] < dist:
            continue
        # 인접 노드 확인
        for next, weight in city[cur]:
            cost = dist + weight
            if cost < dists[next]:
                dists[next] = cost
                heapq.heappush(q, (cost, next))
    return dists


result = digk(sn)
print(result[en])
728x90
반응형

'BASIC > 코딩테스트' 카테고리의 다른 글

[12865] 평범한 배낭  (0) 2026.01.26
[2096] 내려가기  (0) 2026.01.23
[11660] 구간 합 구하기5  (0) 2026.01.21
[1991] 트리 순회  (0) 2026.01.19
[1932] 정수 삼각형  (0) 2026.01.16