diff --git a/백준/Gold/1504. 특정한 최단 경로/README.md b/백준/Gold/1504. 특정한 최단 경로/README.md new file mode 100644 index 0000000..3bee8ae --- /dev/null +++ b/백준/Gold/1504. 특정한 최단 경로/README.md @@ -0,0 +1,30 @@ +# [Gold IV] 특정한 최단 경로 - 1504 + +[문제 링크](https://www.acmicpc.net/problem/1504) + +### 성능 요약 + +메모리: 66172 KB, 시간: 420 ms + +### 분류 + +데이크스트라, 그래프 이론, 최단 경로 + +### 제출 일자 + +2025년 3월 18일 15:41:14 + +### 문제 설명 + +

방향성이 없는 그래프가 주어진다. 세준이는 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을 출력한다.

+ diff --git a/백준/Gold/1504. 특정한 최단 경로/특정한 최단 경로.py b/백준/Gold/1504. 특정한 최단 경로/특정한 최단 경로.py new file mode 100644 index 0000000..ee02006 --- /dev/null +++ b/백준/Gold/1504. 특정한 최단 경로/특정한 최단 경로.py @@ -0,0 +1,53 @@ +import sys +import heapq + +sys.setrecursionlimit(10**6) +input = sys.stdin.readline + +n, e = map(int, input().split()) #정점의 개수 N과 간선의 개수 E + +graph = [[] for _ in range(n+1)] +distance = [sys.maxsize] * (n+1) +start = 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 graph[v1]: + if(i[0]==v2): + v_weight = i[1] + break + +q = [] + + +def dijkstra(start): + distances = [sys.maxsize] * (n + 1) + distances[start] = 0 + q = [] + heapq.heappush(q, (0, start)) + + while q: + dist, now = heapq.heappop(q) + if distances[now] < dist: + continue + for nxt, weight in graph[now]: + cost = dist + weight + if cost < distances[nxt]: + distances[nxt] = cost + heapq.heappush(q, (cost, nxt)) + return distances + +d1 = dijkstra(1) +dv1 = dijkstra(v1) +dv2 = dijkstra(v2) + +path1 = d1[v1] + dv1[v2] + dv2[n] +path2 = d1[v2] + dv2[v1] + dv1[n] +result = min(path1, path2) + +print(result if result < sys.maxsize else -1)