#include <iostream>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#include <unordered_map>
#include <queue>
#include <set>
#include <unordered_set>
#include <complex>
#include <list>
#include <cassert>
#include <chrono>
#include <random>
#include <stack>
#include <iomanip>
#include <fstream>
using namespace std;
#define endl "\n"
#define int long long
const int INF = 1e9+7;
const int MOD = 1e9+7;
int n, m;
vector<vector<pair<int, int>>> adj;
vector<int> dijkstra(int s){
vector<int> dist(n+1, INF);
vector<bool> vis(n+1, false);
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
dist[s] = 0;
pq.push({0, s});
while(!pq.empty()){
int u = pq.top().second;
pq.pop();
if(vis[u]) continue;
vis[u] = true;
for(auto &i : adj[u]){
int v = i.first, w = i.second;
if(dist[v] > max(w, dist[u] + 1)){
dist[v] = max(w, dist[u] + 1);
pq.push({dist[v], v});
}
}
}
return dist;
}
void solve(){
cin >> n >> m;
vector<int> a(n+1);
for(int i = 1; i <= n; i++){
cin >> a[i];
}
adj.resize(n+1);
for(int i = 0; i < m; i++){
int u, v;
cin >> u >> v;
adj[u].push_back({v, a[v]});
adj[v].push_back({u, a[u]});
}
vector<int> dist1 = dijkstra(1);
vector<int> dist2 = dijkstra(n);
int sol = INF;
for(int i = 1; i <= n; i++){
sol = min(sol, max(dist1[i], dist2[i])*2);
for(auto &j : adj[i]){
sol = min(sol, max(dist1[i], dist2[j.first])*2+1);
sol = min(sol, max(dist1[j.first], dist2[i])*2+1);
}
}
cout << sol << endl;
}
int32_t main(){
ios_base::sync_with_stdio(false); cin.tie(nullptr);
int t = 1;
// cin >> t;
while(t--) solve();
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... |