알고리즘/백준

[백준 1504] 특정한 최단 경로

겜도리도리 2021. 11. 6. 23:49
반응형

문제

백준 1504 특정한 최단 경로 C++

 

1504번: 특정한 최단 경로

첫째 줄에 정점의 개수 N과 간선의 개수 E가 주어진다. (2 ≤ N ≤ 800, 0 ≤ E ≤ 200,000) 둘째 줄부터 E개의 줄에 걸쳐서 세 개의 정수 a, b, c가 주어지는데, a번 정점에서 b번 정점까지 양방향 길이 존

www.acmicpc.net

풀이

다익스트라를 사용합니다.

정점 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<intint>> Vertex[801];
// 다익스트라
void Dijkstra(int Start)
{
    priority_queue<pair<intint>> 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