For Programmer

백준 1504번 파이썬 문제풀이(특정한 최단 경로) 본문

코팅테스트/백준 문제 모음

백준 1504번 파이썬 문제풀이(특정한 최단 경로)

유지광이 2022. 4. 20. 23:18
728x90


가중치 있는 최단경로는 우선 다익스트라를 가장 먼저 떠올리면 된다. 그러나 해당 문제는 조금 생각을 해야 하는데 v1,v2 를 무조건 지나야 한다고 되어있다. 따라서 1 -> N 까지 가는데 v1,v2를 무조건 지나야 한다고 되어 있으므로 나올 수 있는 최단경로는 1 -> v1 -> v2 -> N 이거나 1 -> v2 -> v1 -> N 일 수밖에 없다. 따라서 두가지를 구한 후 그 중 가장 짧은 거리를 출력하면 된다.

 

import heapq
import sys


def dijkstra(s, des, distance):
    q = []
    distance[s] = 0
    heapq.heappush(q, (0, s))

    while q:
        cost, cur = heapq.heappop(q)

        if cur == des:
            return cost

        if cost > distance[cur]:
            continue

        for nxt, nxt_cost in graph[cur]:
            if nxt_cost + cost < distance[nxt]:
                distance[nxt] = nxt_cost + cost
                heapq.heappush(q, (distance[nxt], nxt))

    return INF


input = sys.stdin.readline
N, E = map(int, input().split())
graph = [[] for _ in range(N + 1)]
for i in range(E):
    a, b, cost = map(int, input().split())
    graph[a].append((b, cost))
    graph[b].append((a, cost))

v1, v2 = map(int, input().split())
dest_1 = [1, v1, v2, N]  # 경로1
dest_2 = [1, v2, v1, N]  # 경로2
INF = 1e10  # 무한대 값 설정

temp_dist_1 = 0  # 1 -> v1 -> v2 -> N 까지의 경로의 길이
temp_dist_2 = 0  # 1 -> v2 -> v1 -> N 까지의 경로의 길이
for i in range(3):
    distance = [INF] * (N + 1)
    temp_dist_1 += dijkstra(dest_1[i], dest_1[i + 1], distance)
    distance2 = [INF] * (N + 1)
    temp_dist_2 += dijkstra(dest_2[i], dest_2[i + 1], distance2)

ans = min(temp_dist_1, temp_dist_2)  # 둘중 최단경로를 저장
if ans >= INF:  # 해당 최단경로가 무한대를 넘는다면
    print(-1)
else:  # 그 외의 경우
    print(ans)
728x90
Comments