Submission #971852

#TimeUsernameProblemLanguageResultExecution timeMemory
971852THXuanAirplane (NOI23_airplane)C++14
100 / 100
289 ms27252 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
#define INF 1e18
using namespace std;
typedef long long ll;

vector<int>adj[200005];
ll h[200005], d[200005], dd[200005];
bool visited[200005];

void solve()
{
	int n, m; cin >> n >> m;
	for (int i = 1; i <= n; i++) cin >> h[i];
	for (int i = 1; i <= m; i++) {
		int u, v; cin >> u >> v;
		adj[u].push_back(v);
		adj[v].push_back(u);
	}
	for (int i = 1; i <= n; i++) { d[i] = INF; dd[i] = INF; }
	using T = pair<ll, int>;
	priority_queue<T, vector<T>, greater<T>>pq;
	d[1] = 0;
	pq.push({ 0, 1 });
	while (pq.size()) {
		int a = pq.top().second; pq.pop();
		if (visited[a]) continue;
		visited[a] = true;
		for (auto u : adj[a]) {
			if (d[u] > max(h[u], d[a] + 1)) {
				d[u] = max(h[u], d[a] + 1);
				pq.push({ d[u], u });
			}
		}
	}
	dd[n] = 0;
	pq.push({ 0, n });
	for (int i = 1; i <= n; i++) visited[i] = false;
	while (pq.size()) {
		int a = pq.top().second; pq.pop();
		if (visited[a]) continue;
		visited[a] = true;
		for (auto u : adj[a]) {
			if (dd[u] > max(h[u], dd[a] + 1)) {
				dd[u] = max(h[u], dd[a] + 1);
				pq.push({ dd[u], u });
			}
		}
	}
	ll ans = INF;
	for (int i = 1; i <= n; i++) {
		if (d[i] == dd[i])ans = min(ans, d[i] + dd[i]);
		for (auto u : adj[i]) {
			if (d[i] == dd[u])ans = min(ans, d[i] + dd[u] + 1);
		}
	}
	cout << ans << "\n";
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int t = 1;// cin>>t;
	while (t--) solve();
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...