반응형
문제
풀이
다익스트라를 사용합니다.
정점 v1, v2를 지나고 1부터 시작해서 N에서 끝나는 경로는 다음 2가지 중 하나입니다.
1) 1 -> v1 -> v2 -> N
2) 1 -> v2 -> v1 -> N
따라서 다익스트라를 3번 사용하여 각각의 최소거리를 구해주고 1)과 2)중 최솟값이 정답이 됩니다.
1), 2)의 경로로 모두 도달이 불가능 할 때 (INF일 때)는 -1을 출력합니다.
소스 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
int INF = 98765432;
int N, E, v1, v2;
int Dist[801];
vector<pair<int, int>> Vertex[801];
// 다익스트라
void Dijkstra(int Start)
{
priority_queue<pair<int, int>> PQ;
PQ.push(make_pair(0, Start));
Dist[Start] = 0;
while (!PQ.empty())
{
int Cost = -PQ.top().first;
int Cur = PQ.top().second;
PQ.pop();
for (int i = 0; i < Vertex[Cur].size(); i++)
{
int Next = Vertex[Cur][i].second;
int nCost = Vertex[Cur][i].first;
if (Dist[Next] > Cost + nCost)
{
Dist[Next] = Cost + nCost;
PQ.push(make_pair(-Dist[Next], Next));
}
}
}
}
// Dist 초기화
void Init() {
for (int i = 1; i <= N; i++) {
Dist[i] = INF;
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> N >> E;
int a, b, cost;
for (int i = 0; i < E; i++) {
cin >> a >> b >> cost;
Vertex[a].push_back(make_pair(cost, b));
Vertex[b].push_back(make_pair(cost, a));
}
cin >> v1 >> v2;
Init();
Dijkstra(1);
// 1 to V1, 1 to V2
int StoV1 = Dist[v1];
int StoV2 = Dist[v2];
// V1 to V2, V1 to N
Init();
Dijkstra(v1);
int V1toV2 = Dist[v2];
int V1toN = Dist[N];
// v2 to N
Init();
Dijkstra(v2);
int V2toN = Dist[N];
// S V1 V2 E와 S V2 V1 E 비교
int ans = min(StoV1 + V1toV2 + V2toN, StoV2 + V1toV2 + V1toN);
if (ans >= INF) {
cout << -1;
}
else {
cout << ans;
}
return 0;
}
|
cs |
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준 1405] 미친 로봇 C++ (0) | 2021.11.15 |
---|---|
[백준 2023] 신기한 소수 C++ (0) | 2021.11.10 |
[백준 17298] 오큰수 C++ (0) | 2021.11.04 |
[백준 1967] 트리의 지름 C++ (0) | 2021.11.02 |
[백준 2573] 빙산 C++ (0) | 2021.10.31 |