백준 1916 최소비용 구하기 (C++)

안유태·2022년 9월 8일
0

알고리즘

목록 보기
35/239

1916번: 최소비용 구하기

다익스트라 개념을 물어보는 문제이다. 우선순위 큐를 사용하여 선형 탐색보다 더 빠르게 구할 수 있도록 하였다. 우선순위 큐는 기본적으로 내림차순으로 정렬되기 때문에 cost를 음수화하여 오름차순으로 정렬되도록 해주었다. 다익스트라 개념에 대해 잘 알아두자.



#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>

#define INF 987654321

using namespace std;

int N, M;
vector<pair<int, int>> v[1001];
int d[1001];
int s, e;

void dijkstra() {
    d[s] = 0;
    priority_queue<pair<int, int>> pq;
    pq.push({ s,0 });

    while (!pq.empty()) {
        int cur = pq.top().first;
        int cost = -pq.top().second;

        pq.pop();

        if (d[cur] < cost) continue;

        for (int i = 0; i < v[cur].size(); i++) {
            int next = v[cur][i].first;
            int nd = cost + v[cur][i].second;

            if (nd < d[next]) {
                d[next] = nd;
                pq.push({ next,-nd });
            }
        }
    }
}

void solution() {
    for (int i = 1; i <= N; i++) {
        d[i] = INF;
    }

    dijkstra();

    cout << d[e];
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    cin >> N;
    cin >> M;

    for (int i = 0; i < M; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        v[a].push_back({ b,c });
    }

    cin >> s >> e;

    solution();

    return 0;
}
profile
공부하는 개발자

0개의 댓글