본문 바로가기

백준/골드

[백준 11779번] 최소비용 구하기 2 (C++)

문제링크 : https://www.acmicpc.net/problem/11779

 

11779번: 최소비용 구하기 2

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

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;

vector<pii>graph[1001];
int dist[1001];
int route[1001];
vector<int> routeV;
int N, M, s, e;

void dijkstra()
{
    priority_queue<pii, vector<pii>,greater<pii>>pq; //비용이 적은 것부터 정렬
    pq.push({0, s}); //비용, 시작점
    dist[s] = 0;
    
    while(!pq.empty())
    {
        auto[cost, cur] = pq.top();
        pq.pop();

        if(dist[cur] < cost) continue;

        for(int i=0; i<graph[cur].size(); i++)
        {
            auto [next, ncost] = graph[cur][i]; //다음 위치 및 비용
            if(dist[next] > cost + ncost)
            {
                route[next] = cur; // 경로 저장
                dist[next] = cost + ncost; //비용 저장
                pq.push({ncost + cost, next}); //다음 비용 및 위치 토스
            }

        }
    }
}

int main()
{
    ios_base::sync_with_stdio(0); 
	cin.tie(0);
    
    cin >> N >> M;
    for(int i=1; i<=N; i++) dist[i] = MAX;
    for(int i=0; i<M; i++)
    {
        int u, v, weight;
        cin >> u >> v >> weight;
        graph[u].push_back({v, weight});
    }
    cin >> s >> e;
    dijkstra();
    cout << dist[e] << "\n"; //최소 비용
    while(e)
    {
        routeV.push_back(e); //뒤에서부터 경로 저장
        e = route[e]; //이어진 경로 저장
    }
    cout << routeV.size() << "\n";
    for(int i=routeV.size()-1; i>=0; i--)
    {
        cout << routeV[i] << " "; //담아논 경로 출력 (앞에서 부터 출력 (역순))
    }

    return 0;
}

전형적인 다익스트라 문제에서 추가적으로 경로를 저장해줘야 하는 문제이다.

경로 저장용 새로운 배열을 만들고, 비용을 저장해주는 부분에서 다음값과 연결된 현재 경로를 저장해준다.

 

이후 경로를 출력해줄때는 목적지인 end값에서 앞으로 연결된 값을 추적해주면서 해당 경로값들을 따로 저장해준다.

이후 출력할때 앞에서 뒤에서부터 저장했기 때문에 역순으로 하여 앞에서부터 값을 출력해준다.

'백준 > 골드' 카테고리의 다른 글

[백준 1238번] 파티 (C++)  (0) 2023.08.21
[백준 1197번] 최소 스패닝 트리 (C++)  (0) 2023.08.20
[백준 1918번] 후위 표기식 (C++)  (0) 2023.08.18
[백준 11401번] 이항 계수 3 (C++)  (0) 2023.08.17
[백준 13172번] Σ (C++)  (0) 2023.08.16