Submission

Status:
[P-SSSSSSSSSSSSSSSSSS]

Score: 0

User: ftm

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

Language: cpp

Time: 0.002 second

Submitted On: 2025-03-14 22:00:34

#include<bits/stdc++.h>
using namespace std;
#define f(i,a,b,c) for(int i=a;i<=b;i+=c)
#define r(i,a,b,c) for(int i=a;i>=b;i-=c)
#define fi first
#define se second
#define pb push_back
using ll=long long int;
using pii=array<int,2>;
const int N=500;
const int inf=1e9;
int adj[N][N];
vector<pii> g[2][N];
priority_queue<pii,vector<pii>,greater<pii>> q;
vector<vector<int>> dis(4,vector<int>(N,inf));
bool vis[4][N];


int main(){
	ios::sync_with_stdio(0); cin.tie(0);
	int n,m;cin>>n>>m;
	f(i,1,m,1) {
		int u,v;
		cin>>u>>v;
		adj[u][v]=1;
		adj[v][u]=1;
	}
	f(i,1,n,1){
		f(j,i+1,n,1){
			if(adj[i][j]){
				g[0][i].pb({j,10*(j-i)});
				g[0][j].pb({i,10*(j-i)});
			}
			else{
				g[1][i].pb({j,10*(j-i)});
				g[1][j].pb({i,10*(j-i)});
			}
		}
	}
	dis[0][1]=0;
	q.push({0,1});
	while(!q.empty()){
		int u=q.top()[1];
		int d=q.top()[0];
		//cout<<u<<" "<<d<<"\n";
		q.pop();
		if(u==n){
			break;
		}
		if(vis[0][u]) continue;
		vis[0][u]=1;
		for(auto e:g[0][u]){
			int v=e[0];
			int w=e[1];
			if(!vis[0][v] && dis[0][v]>dis[0][u]+w){
				dis[0][v]=dis[0][u]+w;
				q.push({dis[0][v],v});
			}
		}
	}

	while(!q.empty()) q.pop();
	
	dis[1][1]=0;
	q.push({0,1});
	while(!q.empty()){
		int u=q.top()[1];
		int d=q.top()[0];
		q.pop();
		if(u==n){
			break;
		}
		if(vis[1][u]) continue;
		vis[1][u]=1;
		for(auto e:g[1][u]){
			int v=e[0];
			int w=e[1];
			if(v!=n && dis[1][u]+w==dis[0][v]) continue;
			if(!vis[1][v] && dis[1][v]>dis[1][u]+w){
				dis[1][v]=dis[1][u]+w;
				q.push({dis[1][v],v});
			}
		}
	}
	while(!q.empty()) q.pop();
	
	dis[3][1]=0;
	q.push({0,1});
	while(!q.empty()){
		int u=q.top()[1];
		int d=q.top()[0];
		//cout<<u<<" "<<d<<"\n";
		q.pop();
		if(u==n){
			break;
		}
		if(vis[3][u]) continue;
		vis[3][u]=1;
		for(auto e:g[1][u]){
			int v=e[0];
			int w=e[1];
			if(!vis[3][v] && dis[3][v]>dis[3][u]+w){
				dis[3][v]=dis[3][u]+w;
				q.push({dis[3][v],v});
			}
		}
	}
	
	while(!q.empty()) q.pop();
	
	dis[2][1]=0;
	q.push({0,1});
	while(!q.empty()){
		int u=q.top()[1];
		int d=q.top()[0];
		q.pop();
		if(u==n){
			break;
		}
		if(vis[2][u]) continue;
		vis[2][u]=1;
		for(auto e:g[0][u]){
			int v=e[0];
			int w=e[1];
			if(v!=n && dis[2][u]+w==dis[3][v]) continue;
			if(!vis[2][v] && dis[2][v]>dis[2][u]+w){
				dis[2][v]=dis[2][u]+w;
				q.push({dis[2][v],v});
			}
		}
	}
	
	if((dis[0][n]==-1 || dis[1][n]==-1)){
		if((dis[2][n]==-1 || dis[3][n]==-1)) cout<<-1;	
		else cout<<max(dis[2][n],dis[3][n]);
	} 
	else{
		if((dis[2][n]==-1 || dis[3][n]==-1)) cout<<max(dis[1][n],dis[0][n]);
		else cout<<min(max(dis[1][n],dis[0][n]),max(dis[2][n],dis[3][n]));
	}
}