#include<bits/stdc++.h>
#define loop(a,b,c,d) for(int a=b; a<c; a+=d)
#define loop2(a,b,c,d) for(int a=b; a>=c; a-=d)
#define bl(i,n) loop(i,0,n,1)
#define bl2(i,n) loop2(i,n,0,1)
#define int long long
#define nl endl
#define g ' '
using namespace std;
vector<int> graph[200001];
int h[200001];
vector<int> Dijkstra(int src){
priority_queue<pair<int,int>, vector<pair<int,int> >, greater<pair<int,int> > > pq;
pq.push(make_pair(0, src));
vector<int> dist(200001, 1e18);
dist[src] = 0;
vector<int> vis(200001, 0);
while(!pq.empty()){
int v = pq.top().second;
pq.pop();
if(vis[v]) continue;
vis[v] = 1;
for(int ch : graph[v]){
if(max(dist[v]+1, h[ch]) < dist[ch]){
dist[ch] = max(dist[v]+1, h[ch]);
pq.push(make_pair(dist[ch], ch));
}
}
}
return dist;
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(NULL);cout.tie(NULL);
int n, m;
cin>>n>>m;
bl(i,n) cin>>h[i+1];
bl(_,m){
int a, b;
cin>>a>>b;
graph[a].push_back(b);
graph[b].push_back(a);
}
auto dist1 = Dijkstra(1);
auto dist2 = Dijkstra(n);
int ans = 1e18;
for(int node=1; node<=n; node++){
ans = min(ans, max(dist1[node], dist2[node])*2);
for(int ch : graph[node]){
ans = min(ans, max(dist1[node], dist2[ch])*2+1);
ans = min(ans, max(dist1[ch], dist2[node])*2+1);
}
}
cout<<ans;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |