문제
https://www.acmicpc.net/status?user_id=cme10575&problem_id=1504&from_mine=1
풀이
다익스트라로 푸는 문제였다.
1 -> v1 -> v2 -> n
1 -> v2 -> v1 -> n
주어진 조건에 따라 위 두 가지의 경로 중 짧은 것을 반환하면 됐다.
근데 분명 다익스트라 맞게 따라했는데, 나랑 거의 유사한 코드는 통과하고 나의 코드는 시간초과가 떠서
엄청 여러번 시도하며 뭐가 문제인지 찾아봤는데 결론부터 말하면 readline 때문이었다.
백준에선 입력반복문때문에 시초도 뜨는구나. .. ㅠㅠ
import heapq
import sys
input = sys.stdin.readline
INF = int(1e9)
n, e = map(int, input().split())
g = [[] for _ in range(n + 1)]
for _ in range(e):
a, b, w = map(int, input().split())
g[a].append((b, w))
g[b].append((a, w))
def dijkstra(st):
dist = [INF] * (n + 1)
dist[st] = 0
q = [(0, st)]
while q:
wei, now = heapq.heappop(q)
if dist[now] < wei:
continue
for i in g[now]:
cost = wei + i[1]
if cost < dist[i[0]]: # 현재 노드를 거치는게 더 짧은 경우
dist[i[0]] = cost
heapq.heappush(q, (cost, i[0]))
return dist
v1, v2 = map(int, input().split())
minFromSt = dijkstra(1)
minFromv1 = dijkstra(v1)
minFromv2 = dijkstra(v2)
#minFromEd = dijkstra(n)
case1 = minFromSt[v1] + minFromv1[v2] + minFromv2[n]
case2 = minFromSt[v2] + minFromv2[v1] + minFromv1[n]
res = min(case1, case2)
print(res if res < INF else -1)
참고
https://velog.io/@nyanyanyong/알고리즘다익스트라
'알고리즘 스터디' 카테고리의 다른 글
[백준] 14891 톱니바퀴 파이썬 (0) | 2021.10.03 |
---|---|
[백준] 1918 후위표기식 파이썬 (0) | 2021.10.03 |
[백준] 12865 평범한 배낭 파이썬 (0) | 2021.09.29 |
[백준] 13549 숨바꼭질 3 파이썬 (0) | 2021.09.28 |
[백준] 준비운동 Part1. 튼튼한 기본기2 (0) | 2021.09.25 |