Submission #1184854

#TimeUsernameProblemLanguageResultExecution timeMemory
1184854SalihSahinAirplane (NOI23_airplane)C++20
100 / 100
200 ms25336 KiB
#include "bits/stdc++.h"
#define int long long
#define pb push_back
using namespace std;

const int inf = 1e9*2;
const int N = 2e5 + 20;

int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int n, m;
    cin>>n>>m;
    vector<int> adj[n], a(n);
    for(int i = 0; i < n; i++){
        cin>>a[i];
    }
    for(int i = 0; i < m; i++){
        int u, v;
        cin>>u>>v;
        u--, v--;
        adj[u].pb(v);
        adj[v].pb(u);
    }
    vector<int> dis1(n, inf), vis(n);
    dis1[0] = 0;
    priority_queue<pair<int, int> > pq;
    pq.push({0, 0});
    while(!pq.empty()){
        int node = pq.top().second;
        pq.pop();

        if(vis[node]) continue;
        vis[node] = 1;

        for(auto itr: adj[node]){
            if(dis1[itr] > max(dis1[node] + 1, a[itr])){
                dis1[itr] = max(dis1[node] + 1, a[itr]);
                pq.push({-dis1[itr], itr});
            }
        }
    }

    vector<int> disn(n, inf);
    for(int i = 0; i < n; i++){
        vis[i] = 0;
    }
    disn[n-1] = 0;
    pq.push({0, n-1});
    while(!pq.empty()){
        int node = pq.top().second;
        pq.pop();

        if(vis[node]) continue;
        vis[node] = 1;

        for(auto itr: adj[node]){
            if(disn[itr] > max(disn[node] + 1, a[itr])){
                disn[itr] = max(disn[node] + 1, a[itr]);
                pq.push({-disn[itr], itr});
            }
        }
    }

    int ans = inf;
    if(dis1[n-1] == 1){
        cout<<1<<endl;
        return 0;
    }
    for(int i = 0; i < n; i++){
        ans = min(ans, max(dis1[i], disn[i]) * 2);
    }
    for(int i = 0; i < n; i++){
        for(auto itr: adj[i]){
            int val = max(dis1[i], disn[itr]) * 2 + 1;
            ans = min(ans, val);
        }
    }

    cout<<ans<<endl;
    return 0;
}

/*
11 12
0 0 0 0 0 0 2 2 1 5 0
1 2
2 3
3 4
4 5
5 6
6 11
1 7
7 8
8 9
9 11
1 10
10 11
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...