코딩테스트
백준 1504 특정한 최단 경로 파이썬
yolang
2025. 1. 20. 22:19
728x90
🔗 [백준]1504 특정한 최단 경로
📌오늘의 학습 키워드
- 다익스트라 짬뽕
✨공부한 내용 본인의 언어로 정리하기
- 다익스트라를 사용하는 문제라고 인식했다.
- 각 정점 별로 start ➡️ v1, v1 ➡️ v2, v2 ➡️ end 까지의 다익스트라 값을 더한다.
- 최소값을 찾는다.
📚오늘의 회고
- 다익스트라를 구현할 때 자료구조를 deque로 했다가 heap으로 고쳤다.
- 1 ➡️ v1 ➡️ v2 ➡️ end 말고 1 ➡️ v2 ➡️ v1 ➡️ end 를 고려하지 않아서 고쳤다.
- 각각의 전체 값을 구하는 과정에서 다익스트라(start, end) 이런식으로 구해서 더해주려고 했으나 그냥 각 점에서의 전체 다익스트라값을 구하고 인덱스를 찾는 방식으로 고쳤다.
[🤓문제 해결 코드]
import heapq
from heapq import heappush
import sys
N, E = map(int, input().split())
graph = [[] for _ in range(N + 1)]
for n in range(E):
a, b, c = map(int, input().split())
graph[a].append((b, c))
graph[b].append((a, c))
v1, v2 = map(int, input().split())
def dijkstra(start):
distance = [sys.maxsize for _ in range(N + 1)]
distance[start] = 0
hq = []
heappush(hq, (start, 0))
while hq:
node, dist = heapq.heappop(hq)
if dist > distance[node]:
continue
for next_n, value in graph[node]:
new_dist = dist + value
if new_dist < distance[next_n]:
distance[next_n] = new_dist
heapq.heappush(hq, (next_n, new_dist))
return distance
dist_from_1 = dijkstra(1)
dist_from_v1 = dijkstra(v1)
dist_from_v2 = dijkstra(v2)
# 1 -> v1 -> v2 -> N
path1 = dist_from_1[v1] + dist_from_v1[v2] + dist_from_v2[N]
# 1 -> v2 -> v1 -> N
path2 = dist_from_1[v2] + dist_from_v2[v1] + dist_from_v1[N]
result = min(path1, path2)
if result >= sys.maxsize:
print(-1)
else:
print(result)
728x90