민준이 블로그에영

[BOJ - 12763] 지각하면 안 돼(C++) 본문

Baekjoon(C++)/다익스트라

[BOJ - 12763] 지각하면 안 돼(C++)

alswns8081 2025. 3. 11. 15:11

문제

접근 방법

- T 분 이내에 1 -> N 번 건물까지 M 만큼의 돈 이하로 갈 수 있다면, 최소 지출이 얼마인가?

- T 분이내에 도착할 수 있어야 함, M 이하의 돈으로 도착할 수 있어야 함

 

-> 일반적인 다익스트라 문제에서 비용이라는 제약조건이 추가된 내용

how?

= 평소에 저장하던 pair 구조가 아닌 tuple 구조 형태로 저장 -> 최소 비용을 찾아야 하므로 pq에 비용, 시간, 현재 위치로 저장하며 조건에 맞을 경우 Queue에 삽입

 

코드

#include <iostream>
#include <vector>
#include <queue>
#include <tuple>
using namespace std;
#define INF 1e9

int N, T, M, L;
vector<tuple<int, int, int>> adj[10001];

void dijkstra() {
    priority_queue<tuple<int, int, int>, vector<tuple<int, int, int>>, greater<>> pq;
    pq.push(make_tuple(0, 0, 1));
    vector<int> dist(N+1, INF);
    dist[0] = 0;

    while (!pq.empty()) {
        auto [cur_cost, cur_dist, cur_pos] = pq.top();
        pq.pop();

        if (cur_pos == N) {
            cout << cur_cost << '\n';
            return;
        }

        for (auto &[next_pos, next_dist, next_cost] : adj[cur_pos]) {
            int new_cost = cur_cost + next_cost;
            int new_dist = cur_dist + next_dist;

            if (new_dist <= T && new_cost <= M) {
                pq.push(make_tuple(new_cost, new_dist, next_pos));
            }
        }
    }

    cout << -1 << '\n';
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> N;

    cin >> T >> M;

    cin >> L;

    for (int i = 1; i <= L; i++) {
        int s, e, t, c;
        cin >> s >> e >> t >> c;

        adj[s].push_back({e, t, c});
        adj[e].push_back({s, t, c});
    }
    
    dijkstra();

    return 0;
}

 

링크

12763번: 지각하면 안 돼

'Baekjoon(C++) > 다익스트라' 카테고리의 다른 글

[BOJ - 13911] 집 구하기(C++)  (0) 2025.03.14
[BOJ - 17396] 백도어(C++)  (0) 2025.03.13
[BOJ - 14938] 서강그라운드(C++)  (0) 2025.03.10
[BOJ - 1238] 파티 (C++)  (0) 2025.02.25
[BOJ - 1504] 특정한 최단 경로 (C++)  (0) 2025.02.25