DMOJ · ciw26p1

Shopping Mall

This C++ solution uses simulation for DMOJ ciw26p1 Shopping Mall. Read the reasoning, inspect the code, or try your own test case below.

ciw26p1Graphs & treesSimulationC++48 lines
Solution186of 248
Open official problem ↗ Download C++ file ↓ Search the library → Open full Code Lab ↗ Report an issue ↗

Approach

Simulation

Shopping Mall matches ordered item collection on a graph and the code's node/progress shortest-path state.

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_1_Shopping_Mall.cpp

C++

    #include <bits/stdc++.h>
    using namespace std;
    using ll = long long;
    using i128 = __int128;
    const int inf = 1e9;
    const ll INF = 1e18; //❄️
    int main() {
        ios::sync_with_stdio(0); cin.tie(0); 
        int n, m, k; cin >> n >> m >> k;
        vector<int> v(n + 1);
        for (int i = 1; i <= n; i++) cin >> v[i];
        vector<vector<int>> adj(n + 1);
        for (int i = 0; i < m; i++) {
            int u, v; cin >> u >> v;
            adj[u].push_back(v);
            adj[v].push_back(u);
        }
        vector<vector<int>> dist(k + 1, vector<int>(n + 1, inf)); //dist[i][j] = the minimum cost to reach node j with the first i items purchased
        deque<pair<int, int>> q;
        for (int i = 1; i <= n; i++) {
            if (v[i] == 0) {
                dist[0][i] = 0;
                q.push_back(make_pair(i, 0));
            }
        }
        while (!q.empty()) {
            auto[u, p] = q.front(); q.pop_front();
            int cur = dist[p][u];
            if (p < k && v[u] == p + 1) {
               if (cur < dist[p + 1][u]) {
                dist[p + 1][u] = cur;
                q.push_front(make_pair(u, p + 1));
               }
            }
            for (int v : adj[u]) {
                if (dist[p][v] > cur + 1) {
                    dist[p][v] = cur + 1;
                    q.push_back(make_pair(v, p));
                }
            }
        }
        int ans = inf;
        for (int i = 1; i <= n; i++) {
            ans = min(ans, dist[k][i]);
        }
        cout << ans << '\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.