Baekjoon(C++)/다익스트라
[BOJ - 23033] 집에 빨리 가고 싶어! (C++)
alswns8081
2025. 2. 24. 23:38
문제
접근방법
방향성이 존재하고 최단 경로를 탐색 -> 다익스트라 알고리즘을 사용
대기 시간이 존재 -> 걸리는 시간에 대기 시간을 추가하는 로직을 추가
if (cur_time % interval != 0) wait = interval - (cur_time % interval);
코드
#include <iostream>
#include <queue>
#include <vector>
#define INF 1e9
using namespace std;
int N, M;
vector<pair<int, pair<int, int>>> adj[20001];
int dijkstra() {
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;
vector<int> dist(N+1, INF);
dist[1]=0;
pq.push({0, 1});
while(!pq.empty()) {
auto [cur_time, cur] = pq.top(); pq.pop();
if (dist[cur] < cur_time) continue;
for (auto [next, info]: adj[cur]) {
int travel_time = info.first;
int interval = info.second;
int wait = 0;
if (cur_time % interval != 0) wait = interval - (cur_time % interval);
int next_time = cur_time + wait + travel_time;
if (next_time < dist[next]) {
dist[next] = next_time;
pq.push({next_time, next});
}
}
}
return dist[N];
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N >> M;
for (int i = 0; i < M; i++) {
int A, B, T, W;
cin >> A >> B >> T >> W;
adj[A].push_back({B, {T, W}});
}
cout << dijkstra() << "\n";
return 0;
}