알고리즘 문제 풀기/백준(Baekjoon)
[백준 알고리즘] 1504. 특정한 최단 경로
hibscus
2021. 5. 11. 22:24
✔ 주의할 점
가능한 경로 2개
1 -> v1 -> v2 -> N
1 -> v2 -> v1 -> N
다익스트라 함수를 만들어 놓고,
(1, v1), (v1, v2), (v2, N)
(1, v2), (v2, v1), (v1, N)
각 지점 사이의 최단 경로를 구한 뒤, 두가지의 경로 중 최단 거리를 구했다!
import sys
# 1번 부터 N까지의 최단거리 v1, v2 거쳐서
# 경로없을 때는 1
from heapq import heappop,heappush
INF = int(1e9)
def dijkstra(start, end):
D = [INF] * (N+1)
D[start] = 0
Q = [(0, start)]
while Q:
d, u = heappop(Q)
if D[u] < d: continue
if u == end : return D[end]
for v, w in G[u]:
tmp = d + w
if D[v] > tmp:
D[v] = tmp
heappush(Q, (D[v], v))
return D[end]
N, E = map(int, sys.stdin.readline().split()) # 정점과 간선
G = [[] for _ in range(N+1)]
for _ in range(E):
u, v, w = map(int, sys.stdin.readline().split())
G[u].append((v, w))
G[v].append((u, w))
v1, v2 = map(int, sys.stdin.readline().split())
ans = min(dijkstra(1, v1) + dijkstra(v1, v2) + dijkstra(v2, N), dijkstra(1, v2) + dijkstra(v2, v1) + dijkstra(v1, N))
if ans >= INF:
ans = -1
print(ans)