프로그래밍/문제풀이
[BOJ] 최소비용 구하기 C++ 풀이
Cycrypt0
2021. 7. 12. 14:28
728x90
문제 번호
문제
1916
입력
첫째 줄에 도시의 개수 N(1 ≤ N ≤ 1,000)이 주어지고 둘째 줄에는 버스의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 M+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가 주어진다. 그리고 그 다음에는 도착지의 도시 번호가 주어지고 또 그 버스 비용이 주어진다. 버스 비용은 0보다 크거나 같고, 100,000보다 작은 정수이다.
그리고 M+3째 줄에는 우리가 구하고자 하는 구간 출발점의 도시번호와 도착점의 도시번호가 주어진다. 출발점에서 도착점을 갈 수 있는 경우만 입력으로 주어진다.
출력
첫째 줄에 출발 도시에서 도착 도시까지 가는데 드는 최소 비용을 출력한다.
풀이 방법
앞서 우선순위 큐를 이용한 다익스트라 알고리즘에 대해 공부하였고, 기본 다익스트라 문제라 판단하여 풀이를 시작하였다.
그러나 이전 코드에서는 최종 결과 result 를 전역변수로 선언한 뒤 INF로 초기화 해주었는데, 초기화 과정에서 문제가 있었는지 채점 56%에서 '틀렸습니다' 세례를 받고, 살짝 틀어서 dijkstra 함수의 리턴값을 vector 로 한 뒤 result로 받는 방법을 채택하여 풀이하였다.
문제 자체는 단순한 다익스트라 이므로, 응용할것도 없이 해당 코드를 가져다 사용하였다.
풀이 코드
#define _CRT_SECURE_NO_WARNINGS
#define INF 1100000000
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
vector <pair<int, int>> MAP[100000];
vector<int> dijkstra(int start, int cnt) {
vector<int> d(cnt, INF);
d[start] = 0;
priority_queue<pair<int, int>> pq;
pq.push(make_pair(start, 0));
while (!pq.empty()) {
int current = pq.top().first;
int distance = -pq.top().second;
pq.pop(); // 가장 짧은 거리 뽑아냄
if (d[current] < distance) continue;
for (int i = 0; i < MAP[current].size(); i++) {
int next = MAP[current][i].first;
int nextDistance = distance + MAP[current][i].second;
if (nextDistance < d[next]) {
d[next] = nextDistance;
pq.push(make_pair(next, -nextDistance));
}
}
}
return d;
}
int main(void) {
int N, M;
int start, end;
scanf("%d\n%d", &N, &M);
for (int i = 0; i < M; i++) {
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
MAP[a].push_back(make_pair(b, c));
} // Graph 생성
scanf("%d %d", &start, &end);
vector<int> result = dijkstra(start, N+1);
printf("%d", result[end]);
}
결과
728x90