Submission #1334805

#TimeUsernameProblemLanguageResultExecution timeMemory
1334805mamabearCurrents (EGOI25_currents)C++20
100 / 100
303 ms27240 KiB
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

const int INF = 1e9;

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

    int N, M;
    if (!(cin >> N >> M)) return 0;

    vector<vector<int>> adj(N);
    vector<vector<int>> rev_adj(N);

    for (int i = 0; i < M; ++i) {
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v);
        rev_adj[v].push_back(u);
    }

    vector<int> dist_0(N, -1);
    queue<int> q;
    
    dist_0[0] = 0;
    q.push(0);
    
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        
        for (int v : adj[u]) {
            if (dist_0[v] == -1) {
                dist_0[v] = dist_0[u] + 1;
                q.push(v);
            }
        }
    }

    vector<int> E(N, INF);
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;

    E[N - 1] = 0;
    pq.push({0, N - 1});

    while (!pq.empty()) {
        auto [d, u] = pq.top();
        pq.pop();

        if (d > E[u]) continue;

        for (int v : rev_adj[u]) {
            int new_val = max(dist_0[v], E[u] + 1);
            
            if (new_val < E[v]) {
                E[v] = new_val;
                pq.push({E[v], v});
            }
        }
    }

    for (int i = 0; i < N - 1; ++i) {
        cout << E[i] << (i == N - 2 ? "" : " ");
    }
    cout << "\n";

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...