본문 바로가기
Study (etc)/Problem Solving

[BOJ / C++] 11779번 : 최소비용 구하기 2

by Haren 2023. 9. 21.

문제

n(1≤n≤1,000)개의 도시가 있다. 그리고 한 도시에서 출발하여 다른 도시에 도착하는 m(1≤m≤100,000)개의 버스가 있다. 우리는 A번째 도시에서 B번째 도시까지 가는데 드는 버스 비용을 최소화 시키려고 한다. 그러면 A번째 도시에서 B번째 도시 까지 가는데 드는 최소비용과 경로를 출력하여라. 항상 시작점에서 도착점으로의 경로가 존재한다.

입력

첫째 줄에 도시의 개수 n(1≤n≤1,000)이 주어지고 둘째 줄에는 버스의 개수 m(1≤m≤100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가 주어진다. 그리고 그 다음에는 도착지의 도시 번호가 주어지고 또 그 버스 비용이 주어진다. 버스 비용은 0보다 크거나 같고, 100,000보다 작은 정수이다.

그리고 m+3째 줄에는 우리가 구하고자 하는 구간 출발점의 도시번호와 도착점의 도시번호가 주어진다.

출력

첫째 줄에 출발 도시에서 도착 도시까지 가는데 드는 최소 비용을 출력한다.

둘째 줄에는 그러한 최소 비용을 갖는 경로에 포함되어있는 도시의 개수를 출력한다. 출발 도시와 도착 도시도 포함한다.

셋째 줄에는 최소 비용을 갖는 경로를 방문하는 도시 순서대로 출력한다.

Solved.ac 레벨

골드 III

풀이

지난 번에 풀었던 1916번 최소비용 구하기 다익스트라 문제에서 경로에 포함되는 도시들만 구하면 되는 문제였다.

 

[BOJ / C++] 1916번 : 최소비용 구하기

문제 N개의 도시가 있다. 그리고 한 도시에서 출발하여 다른 도시에 도착하는 M개의 버스가 있다. 우리는 A번째 도시에서 B번째 도시까지 가는데 드는 버스 비용을 최소화 시키려고 한다. A번째

heibondk.tistory.com

최소 비용을 저장하는 dist 배열이 갱신되는 시점에 다음 노드가 어디서 출발했는지를 배열로 저장해두었다.

route 배열을 활용했는데, route[nxtNode] = curNode는 nxtNode로 갈 때 최소 비용을 들이기 위해서는 curNode에서 출발해야 한다는 의미로 사용하였다.

 

처음에는 예제의 1, 3, 5가 나오지 않고 1, 4, 5가 자꾸 나와서 당황했는데 1, 4, 5를 거쳐도 1에서 5까지 가는 데에 최소비용을 활용할 수 있었다...

Code

#include <bits/stdc++.h>
#define MAX 100001
#define INF 987654321

using namespace std;

int n, m;
int start, dest;
vector<pair<int, int>> MAP[MAX];
vector<int> result;
priority_queue<pair<int, int>> pq;
int dist[1001];
int route[1001];
vector<int> ans;

void dijkstra() {
    for(int i = 1; i <= n; i++) {
        dist[i] = INF;
    }

    dist[start] = 0;
    pq.push({0, start});
    ans.push_back(start);

    while(!pq.empty()) {
        int curNode = pq.top().second;
        int curCost = -pq.top().first;
        pq.pop();

        if(dist[curNode] < curCost) continue;

        for(int i = 0; i < MAP[curNode].size(); i++) {
            int nxtNode = MAP[curNode][i].first;
            int nxtCost = curCost + MAP[curNode][i].second;

            if(dist[nxtNode] > nxtCost) {
                route[nxtNode] = curNode;
                dist[nxtNode] = nxtCost;
                pq.push({-nxtCost, nxtNode});
            }
        }
    }
}

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

    cin >> n >> m;

    for(int i = 0; i < m; i++) {
        int s, e, c;
        cin >> s >> e >> c;
        MAP[s].push_back({e, c});
    }

    cin >> start >> dest;

    dijkstra();

    int idx = dest;
    while(1) {
        if(route[idx] == 0) {
            result.push_back(start);
            break;
        }
        result.push_back(idx);
        idx = route[idx];

    }

    reverse(result.begin(), result.end());
    cout << dist[dest] << "\n";
    cout << result.size() << "\n";

    for(auto i : result) {
        cout << i << " ";
    }
    cout << "\n";


    return 0;
}
 

11779번: 최소비용 구하기 2

첫째 줄에 도시의 개수 n(1≤n≤1,000)이 주어지고 둘째 줄에는 버스의 개수 m(1≤m≤100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스

www.acmicpc.net