Submission
Status:
[PP-SSSSSSSSSSSSSSSSS]
Subtask/Task Score:
{0/100}
Score: 0
User: Chawin
Problemset: รถยนต์ รถไฟ เรือเมล์ ลิเก ตำรวจ
Language: cpp
Time: 0.002 second
Submitted On: 2026-03-22 08:22:08
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int inf = 1e9+7;
int main(){
ios_base::sync_with_stdio(0), cin.tie(0);
int n, m;
cin >> n >> m;
vector<vector<pair<int, int>>> adjT(n+1);
vector<vector<bool>> rail(n+1, vector<bool>(n+1, false));
for(int i = 0; i < m; i++){
int x, y;
cin >> x >> y;
int w = 10 * abs(y-x);
adjT[x].push_back({y, w});
adjT[y].push_back({x, w});
rail[x][y] = rail[y][x] = true;
}
vector<vector<pair<int, int>>> adjC(n+1);
for(int u = 1; u <= n; u++){
for(int v = 1; v <= n; v++){
if(u == v) continue;
if(!rail[u][v]){
int w = 10 * abs(v-u);
adjC[u].push_back({v, w});
}
}
}
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
vector<int> distT(n+1, inf);
pq.push({0, 1});
distT[1] = 0;
while(!pq.empty()){
int d = pq.top().first;
int u = pq.top().second;
pq.pop();
if(d > distT[u]) continue;
for(auto &x : adjT[u]){
int v = x.first;
int w = x.second;
if(distT[u]+w < distT[v]){
distT[v] = distT[u]+w;
pq.push({distT[v], v});
}
}
}
vector<int> distC(n+1, inf);
pq.push({0, 1});
distC[1] = 0;
while(!pq.empty()){
int d = pq.top().first;
int u = pq.top().second;
pq.pop();
if(d > distC[u]) continue;
for(auto &x : adjC[u]){
int v = x.first;
int w = x.second;
if(distC[u]+w < distC[v]){
distC[v] = distC[u]+w;
pq.push({distC[v], v});
}
}
}
int timeT = distT[n], timeC = distC[n];
if(timeT == inf || timeC == inf) cout << -1;
else cout << min(timeT, timeC);
return 0;
}