DMOJ · dmopc14ce1p4

DMOPC '14 Exam Time P4 - Exam Delay

This C++ solution uses shortest path for DMOJ dmopc14ce1p4 DMOPC '14 Exam Time P4 - Exam Delay. Read the reasoning, inspect the code, or try your own test case below.

dmopc14ce1p4Graphs & treesShortest pathC++39 lines
Solution086of 248
Open official problem ↗ Download C++ file ↓ Search the library → Open full Code Lab ↗ Report an issue ↗

Approach

Shortest path

Exam Delay graph input, travel-time shortest path, edge count, and rounded delay calculation match.

Graphs & trees

Problem and code

Useful links.

Written by benbenyaojifen. Try the problem first, then compare your approach with the code.

Open official problem ↗View exact source file ↗
Implementation

P_4_Exam_Delay.cpp

C++

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int inf = 1e9;
    const long long INF = 1e17; //❄️
    int main() {
        ios::sync_with_stdio(0); cin.tie(0); 
        int n, m; cin >> n >> m;
        vector<vector<pair<double, int>>> adj(n + 1);
        for (int i = 0; i < m; i++) {
            int u, v, d, s; cin >> u >> v >> d >> s;
            double w = (double) d / (double) s * (double) 60; //minute
            adj[u].emplace_back(w, v);
            adj[v].emplace_back(w, u);
        }
        vector<pair<double, int>> dist(n + 1, make_pair(inf, inf));
        dist[1] = {(double) 0, 0};
        priority_queue<tuple<double, int, int>, vector<tuple<double, int, int>>, greater<tuple<double, int, int>>> pq;
        // same dist, same edge count
        pq.emplace(0, 0, 1);
        while (!pq.empty()) {
             auto[w, e, u] = pq.top(); pq.pop();
             if (u == n) break;
            //  if (w > dist[u].first) continue;
             for (auto[wt, v] : adj[u]) {
                if (dist[v].first > wt + w) {
                    dist[v].first = wt + w;
                    dist[v].second = e + 1;
                    pq.emplace(dist[v].first, e + 1, v);
                } else if(dist[v].first == wt + w && e + 1 < dist[v].second) {
                    dist[v].second = e + 1;
                    pq.emplace(dist[v].first, e + 1, v);
                }
             }
        }
        cout << dist[n].second << '\n';
        cout << round(dist[n].first / 3) << '\n';
        return 0;
    }
        

Did this explanation save you time? I'm a Grade 11 student building this free library to make difficult algorithms easier to understand.

Buy me a coffee ↗Keep studying →

Test this problem

Run your code here.

Paste your code, run a test case, compare the output, or trace selected values.

Full trace, comparison & stress testing ↗
StatusReady
Output
No run yet.
Diagnostics
No diagnostics yet.

Each run is isolated and has strict limits. Passing one test does not guarantee the judge will accept the solution.