[BaekJoon 12834 : 다익스트라, Python] - 주간미팅

2021, Nov 10    


백준 1446 주간미팅 : 골드 4



Solution


import sys
from heapq import *
input = sys.stdin.readline

n, v, e = map(int, input().split())
kst, cf = map(int, input().split())
memb_loc = list(map(int, input().split()))

conn = [[] for _ in range(v+1)]
for _ in range(e):
    a, b, l = map(int, input().split())
    conn[a].append([b, l])          # bidirectional connection
    conn[b].append([a, l])

def dist(s, d):
    if s == d:
        return 0
    cost_map = [float('inf') for _ in range(v+1)]
    hq = []
    heappush(hq, [0, s])        # [cur_cummulated_cost, start]
    while hq:
        cur_w, cur_n = heappop(hq)
        for nxt_n, nxt_w in conn[cur_n]:
            if cost_map[nxt_n] <= cur_w: continue
            dist = nxt_w + cur_w 
            if cost_map[nxt_n] > dist:
                cost_map[nxt_n] = dist
                heappush(hq, [dist, nxt_n])
    
    if cost_map[d] == float('inf'):
        return -1
    else: 
        return cost_map[d] 

ans = 0
for m_loc in memb_loc:
    ans += dist(m_loc, kst) + dist(m_loc, cf)       # HOME to KST + HOME to CF

print(ans)


풀이과정 및 느낀점


일반적인 다익스트라 알고리즘이지만, 다른 점은

  1. 양방향 연결구조
  2. 최단거리를 2개 합해진 게 하나의 결과

위 2개 정도이다.

또 한 가지 주의할 점은,
처음에 70% 정도까지 정답률이 채워지다가 틀렸습니다가 떠서 뭐지 했는데 시작점과 도착점이 같은 경우,
dist 함수가 0을 반환해줘야 한다는 것을 놓쳤기 때문이었다.
그냥 항상 시작점의 최단거리를 cost_map[s] = 0 으로 설정하고 문제를 풀어야겠다.