Submission

Status:
[PPP-SSSSSSSSSSSSSSSS]

Score: 0

User: Nozomi_boundfortokyo

Problemset: รถยนต์ รถไฟ เรือเมล์ ลิเก ตำรวจ

Language: cpp

Time: 0.002 second

Submitted On: 2025-03-20 10:23:24

#include <bits/stdc++.h>
using namespace std;
int g[401][401];
int n,m;	
int disttrain[401];
int distcar[401];
int findtrainfirst()
{
	priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq;
	for(int i=1;i<=n;i++)
	{
		disttrain[i]=1e9;
		distcar[i]=1e9;
	}
	disttrain[1]=0;
	distcar[1]=0;
	pq.push({0,1});
	while(!pq.empty())
	{
		int u=pq.top().second;
		pq.pop();
		for(int v=1;v<=n;v++)
		{
			if(!g[u][v]) continue;
			if(disttrain[u]+10*abs(v-u)<disttrain[v])
			{
				disttrain[v]=disttrain[u]+10*abs(v-u);
				pq.push({disttrain[v],v});
			}
		}
	}
//	pq.push({0,1});
	while(!pq.empty())
	{
		int u=pq.top().second;
		pq.pop();
		for(int v=1;v<=n;v++)
		{
			if(g[u][v]) continue;
			else if(distcar[u]+10*abs(v-u)<distcar[v])
			{
				if(distcar[u]+10*abs(v-u)==disttrain[v] && v!=1 && v!=n) continue;
				distcar[v]=distcar[u]+10*abs(v-u);
				pq.push({distcar[v],v});
			}
		}
	}	
	//check whether there is 1e9 in distcar
	for(int i=2;i<=n-1;i++)
	{
		if(distcar[i]==1e9)
		  return -1;
	}
	return max(disttrain[n],distcar[n]);
}
int findcarfirst()
{
	priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq;
	int disttrain[401];
	int distcar[401];
	for(int i=1;i<=n;i++)
	{
		disttrain[i]=1e9;
		distcar[i]=1e9;
	}
	disttrain[1]=0;
	distcar[1]=0;
	pq.push({0,1});
	while(!pq.empty())
	{
		int u=pq.top().second;
		pq.pop();
		for(int v=1;v<=n;v++)
		{
			if(g[u][v]) continue;
			if(distcar[u]+10*abs(v-u)<distcar[v])
			{
				distcar[v]=distcar[u]+10*abs(v-u);
				pq.push({distcar[v],v});
			}
		}
	}
	pq.push({0,1});
	while(!pq.empty())
	{
		int u=pq.top().second;
		pq.pop();
		for(int v=1;v<=n;v++)
		{
			if(g[u][v]) continue;
			if(disttrain[u]+10*abs(v-u)<disttrain[v])
			{
				if(disttrain[u]+10*abs(v-u)==disttrain[v] && v!=1 && v!=n) continue;
				disttrain[v]=disttrain[u]+10*abs(v-u);
				pq.push({disttrain[v],v});
			}
		}
	}	
	//check whether there is 1e9 in distcar
	for(int i=2;i<=n-1;i++)
	{
		if(disttrain[i]==1e9)
		  return -1;
	}
	return max(disttrain[n],distcar[n]);
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=0;i<m;i++)
	{
		int u,v;
		cin>>u>>v;
		g[u][v]=1; //1 is train 0 is car
		g[v][u]=1;
	}
	int d1=findtrainfirst();
	int d2=findcarfirst();
	if(d1==-1 && d2==-1)
	{
		cout<<-1;
	}
	else if(d1==-1)
	{
		cout<<d2;
	}
	else if(d2==-1)
	{
		cout<<d1;
	}
	else if(d1<=d2)
	{
		cout<<d1;
	}
	else if(d1>d2)
	{
		cout<<d2;
	}
}