-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Gold IV] Title: 특정한 최단 경로, Time: 40 ms, Memory: 5728 KB -BaekjoonHub
- Loading branch information
Showing
2 changed files
with
86 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
# [Gold IV] 특정한 최단 경로 - 1504 | ||
|
||
[문제 링크](https://www.acmicpc.net/problem/1504) | ||
|
||
### 성능 요약 | ||
|
||
메모리: 5728 KB, 시간: 40 ms | ||
|
||
### 분류 | ||
|
||
데이크스트라, 그래프 이론, 최단 경로 | ||
|
||
### 제출 일자 | ||
|
||
2024년 3월 15일 06:13:02 | ||
|
||
### 문제 설명 | ||
|
||
<p>방향성이 없는 그래프가 주어진다. 세준이는 1번 정점에서 N번 정점으로 최단 거리로 이동하려고 한다. 또한 세준이는 두 가지 조건을 만족하면서 이동하는 특정한 최단 경로를 구하고 싶은데, 그것은 바로 임의로 주어진 두 정점은 반드시 통과해야 한다는 것이다.</p> | ||
|
||
<p>세준이는 한번 이동했던 정점은 물론, 한번 이동했던 간선도 다시 이동할 수 있다. 하지만 반드시 최단 경로로 이동해야 한다는 사실에 주의하라. 1번 정점에서 N번 정점으로 이동할 때, 주어진 두 정점을 반드시 거치면서 최단 경로로 이동하는 프로그램을 작성하시오.</p> | ||
|
||
### 입력 | ||
|
||
<p>첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존재하며, 그 거리가 c라는 뜻이다. (1 ≤ c ≤ 1,000) 다음 줄에는 반드시 거쳐야 하는 두 개의 서로 다른 정점 번호 v<sub>1</sub>과 v<sub>2</sub>가 주어진다. (v<sub>1</sub> ≠ v<sub>2</sub>, v<sub>1</sub> ≠ N, v<sub>2</sub> ≠ 1) 임의의 두 정점 u와 v사이에는 간선이 최대 1개 존재한다.</p> | ||
|
||
### 출력 | ||
|
||
<p>첫째 줄에 두 개의 정점을 지나는 최단 경로의 길이를 출력한다. 그러한 경로가 없을 때에는 -1을 출력한다.</p> | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
#include <iostream> | ||
#include <algorithm> | ||
#include <vector> | ||
#include <queue> | ||
#define INF 1000000000 | ||
using namespace std; | ||
|
||
vector<vector<pair<int, int>>> edges; | ||
int n, e, a, b, c, u, v; | ||
|
||
pair<int, int> calc(int start, int e1, int e2) { | ||
vector<int> dist(n+1, INF); | ||
priority_queue<pair<int, int>, vector<pair<int,int>>, greater<pair<int,int>>> pq; | ||
pq.push({0, start}); | ||
dist[start] = 0; | ||
while (!pq.empty()) | ||
{ | ||
int cost = pq.top().first; | ||
int node = pq.top().second; | ||
; pq.pop(); | ||
if (cost > dist[node]) | ||
continue; | ||
for (int i = 0; i < edges[node].size(); i++) { | ||
int nc = cost + edges[node][i].second; | ||
int nn = edges[node][i].first; | ||
if (nc < dist[nn]) { | ||
pq.push({nc, nn}); | ||
dist[nn] = nc; | ||
} | ||
} | ||
} | ||
return {dist[e1], dist[e2]}; | ||
} | ||
|
||
int main() | ||
{ | ||
ios_base::sync_with_stdio(0); | ||
cin.tie(0); | ||
//freopen("input.txt", "r", stdin); | ||
|
||
cin >> n >> e; | ||
edges.assign(n+1, vector<pair<int,int>>()); | ||
for(int i = 0; i < e; i++) { | ||
cin >> a >> b >> c; | ||
edges[a].push_back({b,c}); | ||
edges[b].push_back({a,c}); | ||
} | ||
cin >> u >> v; | ||
pair<int, int> r1 = calc(1, u, v); | ||
pair<int, int> r2 = calc(u, v, n); | ||
pair<int, int> r3 = calc(v, n, 0); | ||
long long result = min((long long)r1.first + r3.first, (long long)r1.second + r2.second) + (long long)r2.first; | ||
if (result >= INF) cout << -1; | ||
else cout << result; | ||
return 0; | ||
} |