Submission #551679

#TimeUsernameProblemLanguageResultExecution timeMemory
551679AugustinasJucas007 (CEOI14_007)C++14
100 / 100
953 ms21556 KiB
#include <bits/stdc++.h>
using namespace std;
const int dydis = 2e5 + 10;
const int inf = 1e9;
int n, m;
int s1, s2;
int gd, bd;
vector<int> gr[dydis];
int d1[dydis];
int d2[dydis];
void bfs(vector<int> start, int dist[]){
	for(int i = 1; i <= n; i++) {
		dist[i] = inf;
	}
	queue<int> q;
	for(auto &x : start) {
		q.push(x);
		dist[x] = 0;
	}
	while(q.size()) {
		int v = q.front();
		q.pop();
		for(auto &x : gr[v]) {
			if(dist[x] > dist[v] + 1) {
				dist[x] = dist[v] + 1;
				q.push(x);
			}
		}
	}
}
bool can(int wait) {
	bfs({bd}, d1);
	vector<int> pas;
	for(int i = 1; i <= n; i++) {
		if(d1[i] <= wait) {
			pas.push_back(i);
		}
	}
	bfs(pas, d1);
	bool ret = (d2[s1] <= d1[s1] && d2[s2] <= d1[s2]);
	return ret;
}
int dp1[dydis] = {};
int dp2[dydis] = {};
int when(int dist[]){ 
	vector<pair<int, int> > vec;
	for(int i = 1; i <= n; i++) {
		vec.push_back({dist[i], i});
	}
	sort(vec.begin(), vec.end());
	reverse(vec.begin(), vec.end());
	int ret = 0;
	for(int i = 0; i < n; i++) {
		int v = vec[i].second;
		dp1[v] = (v == s1);
		dp2[v] = (v == s2);
		for(auto x : gr[v]) {
			if(dist[x] != dist[v] + 1) continue;
			dp1[v] |= dp1[x];
			dp2[v] |= dp2[x];
		}
		if(dp1[v] && dp2[v]) ret = max(ret, dist[v]);
	}
	return ret;
}
int main () {
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);
	cin >> n >> m;
	cin >> gd >> bd >> s1 >> s2;
	for(int i = 0; i < m; i++) {
		int a, b; cin >> a >> b; 
		gr[a].push_back(b);
		gr[b].push_back(a);
	}
	bfs({gd}, d2);
	
	int l = 0, mid; int r = n; int ans = -1;
	while(l <= r){
		mid = (l + r) / 2;
		if(can(mid)) {
			ans = mid;
			l = mid+1;
		}else {
			r = mid-1;
		}
	}
	
	if(ans == -1) {
		cout << ans;
		return 0;
	}
	can(ans);
	
	if(d1[s1] != d1[s2]) {
		cout << ans;
		return 0;
	}
	if(d2[s1] != d2[s2]) {
		cout << ans;
		return 0;
	}
	
	int kadaBlogas = when(d1);
	int kadaGeras = when(d2);
	
	ans -= (kadaGeras < kadaBlogas);
	cout << ans;
	
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...