Submission
Status:
[PPPPPPPPPPPPPPPPPPPP]
Subtask/Task Score:
{100/100}
Score: 100
User: Ninstroyer
Problemset: รถยนต์ รถไฟ เรือเมล์ ลิเก ตำรวจ
Language: cpp
Time: 0.042 second
Submitted On: 2025-12-28 21:03:59
#include<bits/stdc++.h>
using namespace std;
#define int long long
int nx = 405, inf = 1e9;
vector<int> Dijkstra(vector<vector<pair<int,int>>>& adj, int start)
{
vector<int> dist(nx, inf);
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq;
dist[start] = 0;
pq.push({0,start});
while(!pq.empty())
{
auto [curW, u] = pq.top();
pq.pop();
if(curW > dist[u]) continue;
for(auto [v, w] : adj[u])
{
if(curW + w < dist[v])
{
dist[v] = curW + w;
pq.push({dist[v], v});
}
}
}
return dist;
}
signed main()
{
// 1 = train, 2 = bus
int n, m; cin>>n>>m;
vector<vector<pair<int,int>>> adj(nx);
vector<vector<pair<int,int>>> bus(nx);
vector<vector<bool>> train(nx,vector<bool>(nx,false));
for(int i = 0; i < m; i++)
{
int u,v; cin>>u>>v;
int d = abs(u-v)*10;
adj[u].push_back({v,d});
adj[v].push_back({u,d});
train[u][v] = true;
train[v][u] = true;
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(i==j) continue;
if(!train[i][j])
{
int d = 10 * abs(i-j);
bus[i].push_back({j,d});
}
}
}
vector<int> distBus = Dijkstra(bus, 1);
vector<int> distTrain = Dijkstra(adj, 1);
if(distBus[n] == inf || distTrain[n] == inf) return cout<<-1, 0;
cout<<max(distBus[n], distTrain[n]);
}