Submission #475268

#TimeUsernameProblemLanguageResultExecution timeMemory
475268MohamedAhmed04007 (CEOI14_007)C++14
100 / 100
280 ms17568 KiB
#include <bits/stdc++.h>

using namespace std ;

const int inf = 1e9 ;
const int MAX = 2e5 + 10 ;

int arr[MAX] ;
int n , m ;
int a , b , x , y ;

vector< vector<int> >adj(MAX) ;

int dist[4][MAX] ;

void bfs(int src , int t)
{
	for(int i = 1 ; i <= n ; ++i)
		dist[t][i] = inf ;
	queue<int>q ;
	dist[t][src] = 0 ;
	q.push(src) ;
	while(!q.empty())
	{
		int node = q.front() ;
		q.pop() ;
		for(auto &child : adj[node])
		{
			if(dist[t][node]+1 < dist[t][child])
			{
				dist[t][child] = dist[t][node]+1 ;
				q.push(child) ;
			}
		}
	}
}

int main()
{
	ios_base::sync_with_stdio(0) ;
	cin.tie(0) ;
	cin>>n>>m ;
	cin>>a>>b>>x>>y ;
	for(int i = 0 ; i < m ; ++i)
	{
		int u , v ;
		cin>>u>>v ;
		adj[u].push_back(v) ;
		adj[v].push_back(u) ;
	}
	bfs(a , 0) ;
	bfs(b , 1) ;
	bfs(x , 2) ;
	bfs(y , 3) ;
	if(dist[1][x] < dist[0][x] || dist[1][y] < dist[0][y])
		return cout<<-1<<"\n" , 0 ;
	if(dist[1][x] - dist[0][x] != dist[1][y] - dist[0][y])
		return cout<<min(dist[1][x] - dist[0][x] , dist[1][y] - dist[0][y]) , 0 ;		
	int Min1 = inf , Min2 = inf ;
	for(int i = 1 ; i <= n ; ++i)
	{
		if(dist[0][i] + dist[2][i] == dist[0][x] && dist[0][i] + dist[3][i] == dist[0][y])
			Min1 = min(Min1 , dist[2][i]) ;
		if(dist[1][i] + dist[2][i] == dist[1][x] && dist[1][i] + dist[3][i] == dist[1][y])
			Min2 = min(Min2 , dist[2][i]) ;
	}
	if(Min1 <= Min2)
		cout<<dist[1][x] - dist[0][x]<<"\n" ;
	else
		cout<<dist[1][x] - dist[0][x] - 1<<"\n" ;
	return 0 ;
}		
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...