백준/최단경로
# 1504 특정한 최단 경로
bright_code
2021. 4. 10. 00:31
728x90
반응형
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
n, e = map(int,input().split()) # 정점, 간선
graph=[ [] for _ in range(n+1) ]
for i in range(e):
a,b,c = map(int,input().split())
graph[a].append((b,c))
graph[b].append((a,c))
v1, v2 = map(int,input().split())
def dij(start):
q = []
heapq.heappush(q,(0,start))
dist = [1e9]*(n+1)
dist[start]=0
while q:
d, now = heapq.heappop(q)
if dist[now] < d : continue
for i in graph[now]:
cost = d + i[1]
if cost < dist[i[0]]:
dist[i[0]] = cost
heapq.heappush(q, (cost,i[0]))
return dist
dist_1 = dij(1)
dist_v1 = dij(v1)
dist_v2 = dij(v2)
answer = min( dist_1[v1]+dist_v1[v2]+dist_v2[n],
dist_1[v2]+ dist_v2[v1]+dist_v1[n])
if answer >= 1e9 :
print(-1)
else :
print(answer)
주의사항 )
1. 양방향 그래프 => graph 에 추가할 때 앞 뒤로 다 해주기
2. v1, v2 는 지나는 순서가 정해진 것은 x => 경우의 수 2개로 나누어서 더 작은 것으로 선택하기
728x90
반응형