알고리즘/백준(BOJ)

백준 - 11779 최소비용 구하기 2

시나모온 2020. 6. 30. 20:39

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

 

11779번: 최소비용 구하기 2

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

www.acmicpc.net

 

다익스트라 + 경로탐색 (트리 형태)

 

 

 

 

 

 

#include <iostream>
#include <vector>
#include <queue>
#define INF 987654321

using namespace std;

int n, m;
vector<vector<pair<int, int>>> vertex;
vector<int> dist;
vector<int> parent;
vector<int> path;

int dijkstra(int start, int end) {
    // weight, vertex
    priority_queue<pair<int, int>> pq;
    dist[start] = 0;
    pq.push({0, start});

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

        if(cur == end) {
            int temp = end;
            while(temp != start) {
                path.push_back(temp);
                temp = parent[temp];
            }
            path.push_back(temp);

            return cdist;
        }
        
        for(int i = 0; i < vertex[cur].size(); i++) {
            int next = vertex[cur][i].first;
            int nextDist = cdist + vertex[cur][i].second;
            if(nextDist < dist[next]) {
                parent[next] = cur;
                dist[next] = nextDist;
                pq.push({-nextDist, next});
            }
        }
    }
}


int main() {
    cin >> n >> m;
    vertex.assign(n + 1, vector<pair<int, int>>());
    dist.assign(n + 1, INF);
    parent.assign(n + 1, 0);

    int u, v, w;
    for(int i = 0; i < m; i++) {
        cin >> u >> v >> w;
        vertex[u].push_back({v, w});
    }

    int start, end;
    cin >> start >> end;

    cout << dijkstra(start, end) << '\n';

    cout << path.size() << '\n';

    for(int i = path.size() - 1; i >= 0; i--) {
        cout << path[i] << ' ';
    }

    return 0;
}

 

 

 

개발 환경 : vscode

지적, 조언, 질문 환영입니다! 댓글 남겨주세요~