Programming/Algorithm
[백준1504] / 특정한 최단 경로 - 다익스트라
__narrrrrmm
2024. 11. 11. 21:46
푼 날짜 : 2024.11.11
푼 문제 : [1504] / 특정한 최단 경로
사용한 언어 : python
알고리즘 : 다익스트라(dijkstra)
접근 방식 :
주어진 두 정점을 반드시 거쳐야 하므로
- 1 -> v1 -> v2 -> N
- 1 -> v2 -> v1 -> N
이렇게 두 경로를 계산해서 작은 값으로 출력했다.
따라서
- 1 -> v1 -> v2 -> N
를 구하려면 (1 -> v1) + (v1 -> v2) + (v2-> N) 이렇게 경로에 대한 값을 각각 구해서 더해주었다.
코드 :
import sys
import heapq
N, M = map(int, sys.stdin.readline().split())
graph = [[] for _ in range(N+1)]
for _ in range(M):
a, b, c = map(int, sys.stdin.readline().split())
graph[a].append((b, c))
graph[b].append((a, c))
v1, v2 = map(int, sys.stdin.readline().split())
def dijkstra(start, end):
heap = [(start, 0)]
dist = [float("INF") for _ in range(N+1)]
dist[start] = 0
while heap:
n_node, n_cost = heapq.heappop(heap)
if dist[n_node] < n_cost: continue
for node, cost in graph[n_node]:
all_cost = n_cost + cost
if dist[node] > all_cost:
dist[node] = all_cost
heapq.heappush(heap, (node, all_cost))
return dist[end]
# 1 -> v1 -> v2 -> N
ans = dijkstra(1, v1) + dijkstra(v1, v2) + dijkstra(v2, N)
# 1-> v2 -> v1 -> N
ans2 = dijkstra(1, v2) + dijkstra(v2, v1) + dijkstra(v1, N)
# 작은 값으로 출력
print(min(ans, ans2) if min(ans, ans2) < float("INF") else -1)
헤헤 heappush에서 all_cost를 넣어주어야 하는걸 자꾸 cost를 넣어줘서 틀렸었다.
앞으로는 실수하지 않도록 조심해야지~