https://www.acmicpc.net/problem/1916
1916번: 최소비용 구하기
첫째 줄에 도시의 개수 N(1 ≤ N ≤ 1,000)이 주어지고 둘째 줄에는 버스의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 M+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그
www.acmicpc.net
다익스트라 연습겸 풀었던 문제인데 개인적으로 꼭 기억해야할 부분이 있어서 글을 써본다. 문제 자체는 특별할 것 없는 다익스트라 구현 문제이다.
문제 풀이 자체에는 문제가 없었는데 계속해서 메모리 초과가 났다. 일단 코드를 보자.
#include <iostream>
#include <vector>
#include <queue>
#include <tuple>
#include <climits>
#include <stack>
using namespace std;
// 다익스트라
struct Vertex {
int vertex;
int cost;
bool operator<(const Vertex v) const {
return this->cost > v.cost;
}
};
vector<vector<Vertex>> adjacant;
priority_queue<Vertex> dijikstraQueue;
vector<int> best;
int N, E;
int S, D;
void input() {
cin >> N >> E;
adjacant.resize(N + 1);
best.resize(N + 1);
fill(best.begin(), best.end(), INT_MAX);
for (int i = 0; i < E; i++) {
int start, dest, cost = 0;
cin >> start >> dest >> cost;
adjacant[start].push_back(Vertex{ dest, cost }); // 인접 배열 방식 저장
}
cin >> S >> D;
}
void dijikstra() {
// 출발지 초기화
Vertex startPos{ S, 0 }; // 출발지 자신까지의 거리는 0
dijikstraQueue.push(startPos);
best[S] = 0;
while (dijikstraQueue.empty() == false) {
Vertex curV = dijikstraQueue.top();
dijikstraQueue.pop();
// 현재 최고 기록과 비교하여 더 크다면 스킵
if (best[curV.vertex] < curV.cost) continue;
// 현재 지점에서 인접 경로를 포함하는 것이 최단 거리 인지를 판단
for (int i = 0; i < adjacant[curV.vertex].size(); i++) {
int there = adjacant[curV.vertex][i].vertex;
int nextCost = best[curV.vertex] + adjacant[curV.vertex][i].cost; // 현재위치 최단 + 인접 경로 비용
// 가격 비교
if (nextCost >= best[there]) continue; // 인접 경로 목적지와 현재 최단 거리의 크기 비교
// 발견 처리
best[there] = nextCost;
dijikstraQueue.push(Vertex{ there, nextCost });
}
}
}
int main()
{
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
input();
dijikstra();
cout << best[D] << endl;
}
line 70, if(nextCost >= best[there]) 이 코드에서 '='을 넣지 않아서가 이유였는데, 아마 테스트 케이스중에 같은 값의 최단 경로가 계속해서 나와서 다익스트라 큐를 메모리 초과 시키는것이 이유인 걸로 추측된다.
여지껏 무조건 최소 비용이 더 작을 때만 갱신 하였는데 이젠 더 작거나 '같을' 때로 코드를 작성해야 할 듯 하다.
'알고리즘 > 알고리즘 문제 풀이' 카테고리의 다른 글
[백준/c++] - 12865 평범한 배낭 (0) | 2023.10.16 |
---|---|
[프로그래머스/C++] - 등굣길 (0) | 2023.10.01 |
[백준/c++] - 14502 연구소 (0) | 2023.08.14 |
[백준/c++] - 1987 알파벳 (0) | 2023.08.14 |
[백준/c++] - 1504 특정한 최단 경로 (0) | 2023.08.11 |