✔ 주의할 점
가능한 경로 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)
'알고리즘 문제 풀기 > 백준(Baekjoon)' 카테고리의 다른 글
[백준 알고리즘] 17471. 게리맨더링 (0) | 2021.05.16 |
---|---|
[백준 알고리즘] 13549. 숨바꼭질 3 (0) | 2021.05.11 |
[백준 알고리즘] 1941.소문난 칠공주 _ python (0) | 2021.04.18 |
[백준 알고리즘] 2206. 벽부수고 이동하기 (0) | 2021.04.04 |
[백준 알고리즘] 5427.불 (0) | 2021.04.04 |