Baekjoon Review
[Gold 3] 11779 최소비용 구하기 2
hanseongbugi
2024. 9. 20. 17:14
https://www.acmicpc.net/problem/11779
다익스트라 알고리즘을 활용하는 문제
입력으로 시작점과 끝점을 알려준다.
따라서 시작점에서 끝점까지의 최소 비용을 구하면 해결할 수 있다.
시작점에서 끝점까지의 최소 비용을 구하는 방법은 일반적인 다익스트라 알고리즘을 활용하면 구할 수 있다.
하지만 최소 비용을 갖는 경로를 구해야하기 때문에 route배열을 따로 정의해야한다.
다익스트라 알고리즘의 경로는 now로 부터 next를 구하며
dist[next]가 최소일때 다음 경로가 된다.
따라서 dist[next]가 최소 일때 rout[next]에 now를 넣게 된다면
끝점에서부터 시작점 까지의 경로를 저장할 수 있다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define INF 2000000000;
int N, M;
int st, en;
int dist[1001];
int route[1001];
vector<pair<int,int>> graph[1001];
vector<int> answer;
void dijk(){
// dist 배열 초기화
for(int i = 0;i<=N;i++)
dist[i] = INF;
priority_queue<pair<int, int>> pq;
pq.push({0, st});
dist[st] = 0;
while(!pq.empty()){
int cost = -pq.top().first;
int now = pq.top().second;
pq.pop();
if(dist[now] < cost)
continue;
for(int i = 0;i<graph[now].size();i++){
int next = graph[now][i].first;
int nCost = graph[now][i].second + cost;
if(nCost < dist[next]){
route[next] = now;
dist[next] = nCost;
pq.push({-nCost, next});
}
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>N>>M;
int a, b, c;
for(int i =0;i<M;i++){
cin>>a>>b>>c;
graph[a].push_back({b, c});
}
cin>>st>>en;
dijk();
cout<<dist[en]<<'\n';
int temp = en;
while(temp){
answer.push_back(temp);
temp = route[temp];
}
cout<<answer.size()<<'\n';
for(int i = answer.size() - 1;i>=0;i--)
cout<<answer[i]<<' ';
}