#include "bits/stdc++.h"
#define int long long
#define all(v) v.begin() , v.end()
#define sz(a) (int)a.size()
using namespace std;
const int INF = 1e18;
void _(){
int n, m;
cin >> n >> m;
int ar[n+5];
for(int i=1;i<=n;i++) cin >> ar[i];
vector<int> v[n+5];
priority_queue<array<int,2>,vector<array<int,2>>,greater<>> pq;
for(int i=1;i<=m;i++){
int a,b;
cin >> a >> b;
v[a].push_back(b);
v[b].push_back(a);
}
vector<int> dist(n+5,INF),dp(n+5,0);
dist[1] = 0;
pq.push({0, 1});
while(!pq.empty()){
int c = pq.top()[1];
int d = pq.top()[0];
pq.pop();
if(d > dist[c]) continue;
for(int u : v[c]){
int xd = d + 1;
if(dp[c] + 1 < ar[u]) xd += ar[u] - dp[c] - 1;
if(xd < dist[u]){
dist[u] = xd;
dp[u] = max(dp[c], ar[u]);
pq.push({dist[u], u});
}
}
}
vector<int> dist2(n+5,INF),dp2(n+5,0);
dist2[n] = 0;
pq.push({0, n});
while(!pq.empty()){
int c = pq.top()[1];
int d = pq.top()[0];
pq.pop();
if(d > dist2[c]) continue;
for(int u : v[c]){
int xd = d + 1;
if(dp2[c] + 1 < ar[u]) xd += ar[u] - dp2[c] - 1;
if(xd < dist2[u]){
dist2[u] = xd;
dp2[u] = max(dp2[c], ar[u]);
pq.push({dist2[u], u});
}
}
}
int ans = INF;
for(int i=1;i<=n;i++) if(dp[i] == dp2[i]) ans = min(ans, dist[i] + dist2[i]);
cout << ans << '\n';
}
int32_t main(){
cin.tie(0); ios::sync_with_stdio(0);
int tc=1;//cin >> tc;
while(tc--) _();
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... |