Submission
Status:
[PPPPPPPPPPPPPPPPPPPP]
Subtask/Task Score:
{100/100}
Score: 100
User: qweqwe
Problemset: รถยนต์ รถไฟ เรือเมล์ ลิเก ตำรวจ
Language: cpp
Time: 0.033 second
Submitted On: 2025-10-21 20:09:07
#include <bits/stdc++.h>
#define speed cin.tie(0)->sync_with_stdio(0)
#define ll long long
#define pii pair<int,int>
#define INF 1e9
using namespace std;
// 1<=n<=400
vector<unordered_set<int>> used(401);
vector<vector<int>> rail(401),road(401);
int main(){
speed;
int n,m;cin >> n >> m;
// rail building
for (int i=0;i<m;i++){
int u,v;cin >> u >> v;
// for rails
rail[u].push_back(v);
rail[v].push_back(u);
// for roads
used[u].insert(v);
used[v].insert(u);
}
// road building
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++){
if (!used[i].count(j) && i!=j){
road[i].push_back(j);
}
}
}
// 1st stp (rails)
vector<int> disrail(n+1,INF),disroad(n+1,INF);
disrail[1]=0;disroad[1]=0;
priority_queue<pii,vector<pii>,greater<pii>> stp;stp.push({0,1});
while (!stp.empty()){
pii temp=stp.top();stp.pop();
//cout << temp.first << " " << temp.second << "\n";
for (int i:rail[temp.second]){
int sum=temp.first+10*abs(i-temp.second);
if (disrail[i]>sum){
stp.push({sum,i});
disrail[i]=sum;
}
}
}//cout << disrail[n];
//2nd stp (roads)
stp.push({0,1});
while (!stp.empty()){
pii temp=stp.top();stp.pop();
//cout << temp.first << " " << temp.second << "\n";
for (int i:road[temp.second]){
int sum=temp.first+10*abs(i-temp.second);
if (disroad[i]>sum){
stp.push({sum,i});
disroad[i]=sum;
}
}
}
// unreachable
if (disrail[n]==INF || disroad[n]==INF) cout << -1;
// reachable
else cout << max(disrail[n],disroad[n]);
return 0;
}