문제
https://www.acmicpc.net/status?user_id=cme10575&problem_id=1504&from_mine=1
채점 현황
www.acmicpc.net
풀이
다익스트라로 푸는 문제였다.
1 -> v1 -> v2 -> n
1 -> v2 -> v1 -> n
주어진 조건에 따라 위 두 가지의 경로 중 짧은 것을 반환하면 됐다.
근데 분명 다익스트라 맞게 따라했는데, 나랑 거의 유사한 코드는 통과하고 나의 코드는 시간초과가 떠서
엄청 여러번 시도하며 뭐가 문제인지 찾아봤는데 결론부터 말하면 readline 때문이었다.
[Python 문법] 파이썬 입력 받기(sys.stdin.readline)
파이썬으로 코딩 테스트를 준비한다면, 반드시 알아야 할 입력방식인 sys.stdin.readline()에 대한 정리 입니다.
velog.io
백준에선 입력반복문때문에 시초도 뜨는구나. .. ㅠㅠ
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)
참고
[파이썬]백준 1504 특정한최단경로
[파이썬]백준 1540 특정한최단경로
velog.io
https://velog.io/@nyanyanyong/알고리즘다익스트라
[알고리즘][python]다익스트라
파이썬으로 다익스트라 정리해봤습니다.
velog.io
'알고리즘 스터디' 카테고리의 다른 글
[백준] 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 |