제출 #1355049

#제출 시각아이디문제언어결과실행 시간메모리
1355049AMel0nCurrents (EGOI25_currents)C++20
100 / 100
138 ms35100 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
#define FOR(i,N) for(ll i = 0; i < N; i++)
#define all(x) (x).begin(), (x).end()
#define F first
#define S second

// EGOI25 Currents

const ll INF = 1e18;

signed main() {
    cin.tie(0); ios::sync_with_stdio(false);
    ll N, M;
    cin >> N >> M;
    vector<vector<ll>> forw(N), rev(N);
    vector<ll> d0(N, INF);//, dN_1(N, INF);
    FOR(i, M) {
        ll a, b;
        cin >> a >> b;
        forw[a].push_back(b);
        rev[b].push_back(a);
    }

    queue<pair<ll,ll>> q1;
    q1.push({0,0});
    while(q1.size()) {
        auto [v, d] = q1.front();
        q1.pop();
        if (d0[v] <= d) continue;
        d0[v] = d;
        for(ll u: forw[v]) q1.push({u, d+1});
    }
    // q1.push({N-1,0});
    // while(q1.size()) {
    //     auto [v, d] = q1.front();
    //     q1.pop();
    //     if (dN_1[v] <= d) continue;
    //     dN_1[v] = d;
    //     for(ll u: rev[v]) q1.push({u, d+1});
    // }

    vector<ll> res(N, INF);
    queue<pair<ll,pair<ll,ll>>> q2;
    q2.push({N-1, {0,0}}); 
    while(q2.size()) {
        ll v = q2.front().F;
        ll d = q2.front().S.F;
        ll pd = q2.front().S.S;
        q2.pop();
        if (res[v] <= max(d, d+pd)) continue;
        res[v] = max(d, d+pd);
        for(ll u: rev[v]) q2.push({u, {d+1, max(pd, d0[u] - (d+1))}});
    }
    FOR(i, N-1) cout << res[i] << ' ';
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…