문제 (https://www.acmicpc.net/problem/11779)
11779번: 최소비용 구하기 2
첫째 줄에 도시의 개수 n(1≤n≤1,000)이 주어지고 둘째 줄에는 버스의 개수 m(1≤m≤100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스
www.acmicpc.net
출발 도시에서 도착 도시까지의 최소 비용을 구하는 일반적인 다익스트라 문제이다. 다른 문제들과 차이점은 최소 비용뿐만 아니라 경로에 포함되어있는 도시의 개수와 방문하는 도시 번호도 출력해야 한다.
따라서 배열을 생성하여 각 도시에 도달하기 위해서는 몇 번 도시에서 출발해야 하는지를 기록했다.
예를 들어, route[a] = b는 "a번에 최소로 도달하기 위해서는 b번에서 와야 한다"라는 의미이다.
route[start] = 0으로 설정해주고 route[end] 값부터 역순으로 경로를 체크한다.
end 값 -> end번에 최소로 도달하기 위한 이전 번호 -> ... -> start 다음으로 방문하는 도시 번호-> start 값
역순으로 경로를 체크했으므로 reverse 함수를 사용한 후 정답을 출력했다.
[소스코드]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
BOJ 11779번: 최소비용 구하기 2 | |
2021-12-29 | |
*/ | |
#include <iostream> | |
#include <vector> | |
#include <queue> | |
#include <algorithm> | |
#define MAX 1001 | |
#define INF 100000001 | |
using namespace std; | |
int d[MAX]; | |
int route[MAX]; // route[a] = b: a번에 최소로 도달하기 위해서는 b 정점에서 와야 한다. | |
vector<pair<int, int>> graph[MAX]; | |
void dijkstra(int start) { | |
priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> pq; // 거리, 노드 | |
pq.push({0, start}); | |
d[start] = 0; | |
while(!pq.empty()) { | |
int distance = pq.top().first; | |
int cur = pq.top().second; | |
pq.pop(); | |
if(d[cur] < distance) continue; | |
for(int i = 0 ; i < graph[cur].size() ; i++) { | |
int newDistance = graph[cur][i].second; | |
int next = graph[cur][i].first; | |
if(distance + newDistance < d[next]) { | |
route[next] = cur; | |
d[next] = distance + newDistance; | |
pq.push({d[next], next}); | |
} | |
} | |
} | |
} | |
int main() { | |
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); | |
vector<int> answer; | |
int n, m; | |
int x, y, z; | |
int start, end; | |
cin >> n >> m; | |
for(int i = 0 ; i < m ; i++) { | |
cin >> x >> y >> z; | |
graph[x].push_back({y, z}); | |
} | |
cin >> start >> end; | |
fill(d, d + n + 1, INF); | |
dijkstra(start); | |
route[start] = 0; | |
int idx = end; | |
while(1) { | |
if(route[idx] == 0) { | |
answer.push_back(start); | |
break; | |
} | |
answer.push_back(idx); | |
idx = route[idx]; | |
} | |
reverse(answer.begin(), answer.end()); | |
cout << d[end] << '\n'; | |
cout << answer.size() << '\n'; | |
for(int i = 0 ; i < answer.size() ; i++) cout << answer[i] << " "; | |
return 0; | |
} |

'ALGORITHM > BOJ' 카테고리의 다른 글
[BOJ] 3020번 개똥벌레 (C++) (0) | 2022.01.05 |
---|---|
[BOJ] 4386번 별자리 만들기 (C++) (0) | 2022.01.04 |
[BOJ] 1484번 다이어트 (C++) (0) | 2022.01.03 |
[BOJ] 1644번 소수의 연속합 (C++) (0) | 2022.01.03 |
[BOJ] 2470번 두 용액 (C++) (0) | 2022.01.03 |