Cometin'

BOJ-1504 - Python

2020-11-05 at Algorithm category

정점의 개수 n, 간선의 개수 e를 입력받은 후 e의 개수만큼 "출발지 도착지 가중치"를 입력받는다. 그 후 정점의 두개 v1, v2를 입력받은 후 정점 1부터 n까지 v1, v2를 반드시 통과한 최단거리를 출력하는 문제. 첫 접근은 deque의 appendleft를 이용하여 다음 방문지가 v1 혹은 v2일 때 우선순위를 높이는 방식이였으나 실패하게 되었다. 접근을 바꾸어 시작, v1, v2에서 출발하는 최단거리 리스트를 저장하고 s > v1 > v2 > n과 s > v2 > v1 > n을 계산 및 비교하여 출력하여 풀었다. 간선을 저장할 때 유무를 찾아 추가하는 방식에서 런타임 에러가 일어나, 수정하여 풀었다.

# import heapq
# import sys
# input = sys.stdin.readline
# INF = sys.maxsize
#
# def dijkstra(start):
#     dist = [INF for _ in range(n+1)]
#     dist[start] = 0
#     q = []
#     heapq.heappush(q, [0, start])
#     while q:
#         weight, here = heapq.heappop(q)
#
#         for there, w in graph[here]:
#             next_weight = weight + w
#             if dist[there] > next_weight:
#                 dist[there] = next_weight
#                 heapq.heappush(q, [next_weight, there])
#     return dist
#
#
# n, e = map(int, input().split())
# graph = {}
#
# for _ in range(e):
#     u, v, w = map(int, input().split())
#     if u not in graph:
#         graph[u] = [[v, w]]
#     else:
#         graph[u].append([v, w])
#     if v not in graph:
#         graph[v] = [[u, w]]
#     else:
#         graph[v].append([u, w])
#
# v1, v2 = map(int, input().split())
# s = dijkstra(1)
# s_v1 = dijkstra(v1)
# s_v2 = dijkstra(v2)
#
# ans = min(s[v1] + s_v1[v2] + s_v2[n],
#           s[v2] + s_v2[v1] + s_v1[n])
# print(ans if ans < INF else -1)

import heapq
import sys
input = sys.stdin.readline
INF = sys.maxsize

def dijkstra(start):
    dist = [INF for _ in range(n+1)]
    dist[start] = 0
    q = []
    heapq.heappush(q, [0, start])
    while q:
        weight, here = heapq.heappop(q)

        for there, w in graph[here]:
            next_weight = weight + w
            if dist[there] > next_weight:
                dist[there] = next_weight
                heapq.heappush(q, [next_weight, there])
    return dist


n, e = map(int, input().split())
graph = [[] for _ in range(n+1)]

for _ in range(e):
    u, v, w = map(int, input().split())
    graph[u].append([v, w])
    graph[v].append([u, w])

v1, v2 = map(int, input().split())
s = dijkstra(1)
s_v1 = dijkstra(v1)
s_v2 = dijkstra(v2)

 # s > v1 > v2 > n과 s > v2 > v1 > n 을 비교
ans = min(s[v1] + s_v1[v2] + s_v2[n],
          s[v2] + s_v2[v1] + s_v1[n])
print(ans if ans < INF else -1)

hyesungoh

Personal blog by hyesungoh.

I like to share my knowledge for those who wandering in issue.