문제풀이/최단경로

[파이썬] [최단경로] 백준 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)