[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)
풀이과정 및 느낀점
일반적인 다익스트라 알고리즘이지만, 다른 점은
- 양방향 연결구조
- 최단거리를 2개 합해진 게 하나의 결과
위 2개 정도이다.
또 한 가지 주의할 점은,
처음에 70% 정도까지 정답률이 채워지다가 틀렸습니다가 떠서 뭐지 했는데 시작점과 도착점이 같은 경우,
dist 함수가 0을 반환해줘야 한다는 것을 놓쳤기 때문이었다.
그냥 항상 시작점의 최단거리를 cost_map[s] = 0 으로 설정하고 문제를 풀어야겠다.