Submission #1321558

#TimeUsernameProblemLanguageResultExecution timeMemory
1321558norrawichzzzAirplane (NOI23_airplane)C++20
100 / 100
520 ms17028 KiB
#include <bits/stdc++.h>
using namespace std;

int main() {
	cin.tie(0)->sync_with_stdio(0);
	int n,m;
	cin>> n>> m;
	
	int req[n+1];
	for (int i=1; i<=n; i++) cin>> req[i];
	
	vector<vector<int>> g(n+1);
	for (int i=0; i<m; i++) {
		int u,v;
		cin>> u>> v;
		
		g[u].push_back(v);
		g[v].push_back(u);
	}
	
	priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> pq;
	pq.push({0, 1});
	
	vector<int> dist(n+1, INT_MAX), rdist(n+1, INT_MAX);
	dist[1] = 0;
	
	while (!pq.empty()) {
		int u=pq.top().second, d=pq.top().first; 
		pq.pop();
		
		if (d > dist[u]) continue;
		
		for (auto &v : g[u]) {
			int add;
			if (req[v] > dist[u]) {
				add = req[v] - dist[u];
			}
			else {
				add = 1;
			}
			if (dist[v] > dist[u] + add) {
				dist[v] = dist[u]+add;
				pq.push({dist[v], v});
			}
		}
	}
	rdist[n] = 0;
	pq.push({0, n});
	while (!pq.empty()) {
		int u=pq.top().second, d=pq.top().first; 
		pq.pop();
		
		if (d > rdist[u]) continue;
		
		for (auto &v : g[u]) {
			int add;
			if (req[v] > rdist[u]) {
				add = req[v] - rdist[u];
			}
			else {
				add = 1;
			}
			if (rdist[v] > rdist[u] + add) {
				rdist[v] = rdist[u]+add;
				pq.push({rdist[v], v});
			}
		}
	}
	int ans=INT_MAX;
	for (int i=1; i<=n; i++) {
		//cout<< dist[i]<< ' '<< rdist[i]<< '\n';
		if (rdist[i] == dist[i]) ans = min(ans, rdist[i]*2);
		else ans = min(ans, max(rdist[i], dist[i])*2-1);
	}
	cout<< ans;
	
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...