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
    
    
  '코딩테스트' 카테고리의 다른 글
| 프로그래머스 - 양과 늑대 (0) | 2025.01.23 | 
|---|---|
| 백준 17825 주사위 윷놀이 파이썬 (1) | 2025.01.22 | 
| 백준 17270 연예인은 힘들어 파이썬 (0) | 2025.01.17 | 
| 백준 1253 좋다 파이썬 (0) | 2025.01.16 | 
| 백준 2211 네트워크 복구 파이썬 (0) | 2025.01.16 |