Python/백준

1504_특정한 최단경로

728x90

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

 

다익스트라 알고리즘을 통해 저번에 최단경로를 구했었는데 이를 활용해서 풀었다.

 

결국 v1,v2 두개의 점을 통과하여 통과하려면

 

1 -> v1 -> v2 -> N

1 -> v2 -> v1 -> N

 

두가지 방법이 존재한다.

 

즉, 1,v1,v2 에서 다른 점들로의 최단거리를 구해놓은 배열을 하나 만들고, 위 방법에 따라서 최단거리를 정해주면 된다.

 

import sys
import heapq
input = sys.stdin.readline

n,e = map(int,input().split())
INF = int(1e9)
graph = [ [] for _ in range(n+1)]
distance = [ [INF] * (n+1) for _ in range(n+1) ]
for _ 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())


for i in [1,v1,v2]:

    q = []
    heapq.heappush(q,[0,i])
    distance[i][i] = 0

    while q:
        cnt,node = heapq.heappop(q)
        if distance[i][node] < cnt:
            continue
        for j,k in graph[node]:
            if cnt + k < distance[i][j]:
                distance[i][j] = cnt + k
                heapq.heappush(q,[cnt+k,j])


result = min(distance[1][v1]+distance[v1][v2]+distance[v2][n],distance[1][v2]+distance[v2][v1]+distance[v1][n])
print(result if result < INF else -1)

 

 

어떻게보면 한점에서 다른점으로 가는 최단거리를 구했던 저번문제의 응용이라고 봐도 될 것 같다.

728x90

'Python > 백준' 카테고리의 다른 글

11404_플로이드  (0) 2022.04.09
11657_타임머신(벨만포드)  (0) 2022.04.08
1753_최단경로  (0) 2022.04.05
1707_이분그래프  (0) 2022.04.04
7562_나이트의 이동  (0) 2022.04.03