[Baekjoon] 1504번 : 특정한 최단 경로
1. 문제Permalink
https://www.acmicpc.net/problem/1504
- 다익스트라 문제
// 문제
방향성이 없는 그래프가 주어진다.
세준이는 1번 정점에서 N번 정점으로 최단 거리로 이동하려고 한다.
또한 세준이는 두 가지 조건을 만족하면서 이동하는
특정한 최단 경로를 구하고 싶은데, 그
것은 바로 임의로 주어진 두 정점은 반드시 통과해야 한다는 것이다.
세준이는 한번 이동했던 정점은 물론,
한번 이동했던 간선도 다시 이동할 수 있다.
하지만 반드시 최단 경로로 이동해야 한다는 사실에 주의하라.
1번 정점에서 N번 정점으로 이동할 때,
주어진 두 정점을 반드시 거치면서 최단 경로로 이동하는 프로그램을 작성하시오.
// 입력
첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다.
(2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000)
둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데,
a번 정점에서 b번 정점까지 양방향 길이 존재하며,
그 거리가 c라는 뜻이다. (1 ≤ c ≤ 1,000)
다음 줄에는 반드시 거쳐야 하는
두 개의 서로 다른 정점 번호 v1과 v2가 주어진다.
(v1 ≠ v2, v1 ≠ N, v2 ≠ 1)
임의의 두 정점 u와 v사이에는 간선이 최대 1개 존재한다.
// 출력
첫째 줄에 두 개의 정점을 지나는 최단 경로의 길이를 출력한다.
그러한 경로가 없을 때에는 -1을 출력한다.
// 예제 입력 1
4 6
1 2 3
2 3 3
3 4 1
1 3 5
2 4 5
1 4 4
2 3
// 예제 출력 1
7
2. 핵심 아이디어Permalink
- 시작점, v1, v2에 대한 다익스트라를 모두 구해 최저값 출력
3. Python 문제풀이Permalink
from heapq import heappush, heappop
import sys
input = sys.stdin.readline
n, e = map(int, input().split())
arr = [[] for i in range(n + 1)]
inf = sys.maxsize
for i in range(e) :
a, b, c = map(int, input().split())
arr[a].append([b, c])
arr[b].append([a, c])
v1, v2 = map(int, input().split())
def dijkstra(start) :
dp = [inf for i in range(n + 1)]
dp[start] = 0
heap = []
heappush(heap, [0, start])
while heap :
w, c = heappop(heap)
for x, y in arr[c] :
tmp = y + w
if dp[x] > tmp :
dp[x] = tmp
heappush(heap, [tmp, x])
return dp
o = dijkstra(1)
p = dijkstra(v1)
q = dijkstra(v2)
cnt = min(o[v1] + p[v2] + q[n], o[v2] + q[v1] + p[n])
print(cnt if cnt < inf else -1)
4. Java 문제풀이Permalink
댓글남기기