문제풀이/최단경로
[파이썬] [최단경로] 백준 1504 특정한 최단 경로
승무_
2022. 2. 26. 10:25
문제
https://www.acmicpc.net/problem/1504
1504번: 특정한 최단 경로
첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존
www.acmicpc.net
코드
import heapq
import sys
input=sys.stdin.readline
INF=sys.maxsize
def dijk(start):
dis = [INF] * (n + 1)
q=[]
heapq.heappush(q,(0,start))
dis[start]=0
while q:
cost,node=heapq.heappop(q)
if dis[node]<cost:
continue
for i in graph[node]:
new_cost=cost+i[1]
if new_cost<dis[i[0]]:
dis[i[0]]=new_cost
heapq.heappush(q,(new_cost,i[0]))
return dis
n,m=map(int, input().split())
graph=[[] for _ in range(n+1)]
for _ in range(m):
a,b,c=map(int, input().split())
graph[a].append([b,c])
graph[b].append([a,c])
v1,v2=map(int, input().split())
one=dijk(1)
v1_=dijk(v1)
v2_=dijk(v2)
result=min(one[v1]+v1_[v2]+v2_[n],one[v2]+v2_[v1]+v1_[n])
if result<INF:
print(result)
else:
print(-1)