Submission
Status:
[PPPPPPPPPPPPPPPPPPPP]
Score: 100
User: mydKN
Problemset: รถยนต์ รถไฟ เรือเมล์ ลิเก ตำรวจ
Language: cpp
Time: 0.125 second
Submitted On: 2025-03-14 05:01:23
#include<bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
struct stc{
int w, ut, uc;
bool operator<(const stc a) const{
return w > a.w;
}
};
const int maxn = 410;
const int inf = 2e9;
int n, m;
pii adj[maxn][maxn];
vector<int> distt(maxn, inf), distc(maxn, inf);
//bool visitedt[maxn], visitedc[maxn];
priority_queue<stc> pq;
int main(){
ios_base::sync_with_stdio(0);cin.tie(0);
cin >> n >> m;
for(int i=0;i<m;++i){
int u, v, w;
cin >> u >> v;
w = abs(u - v) * 10;
adj[u][v].first = w;
adj[u][v].second = 1;
adj[v][u].first = w;
adj[v][u].second = 1;
}
for(int i=1;i<=n;++i){
for(int j=1;j<=i;++j){
if(!adj[i][j].second){
int w = abs(i - j) * 10;
adj[i][j].first = w;
adj[j][i].first = w;
}
}
}
distt[1] = 0;
distc[1] = 0;
pq.push(stc{0, 1, 1});
while(!pq.empty()){
auto [w, ut, uc] = pq.top();
pq.pop();
//if(visitedt[ut] || visitedc[uc] || (ut == uc && ut != 1 && uc != 1)) continue;
if(ut == uc && ut != 1 && uc != 1) continue;
//visitedt[ut] = 1;
//visitedc[uc] = 1;
for(int i=1;i<=n;++i){
if(!adj[ut][i].second || i == ut) continue;
for(int j=1;j<=n;++j){
if(adj[uc][j].second || j == uc) continue;
if(i != j){
int omx = max(distt[i], distc[j]);
int nmx = max(distt[ut] + adj[ut][i].first, distc[uc] + adj[uc][j].first);
if(omx > nmx){
distt[i] = distt[ut] + adj[ut][i].first;
distc[j] = distc[uc] + adj[uc][j].first;
pq.push(stc{nmx, i, j});
//cout << nmx << " " << i << " " << j << "\n";
}
}
}
}
//cout << ut << " " << uc << "\n";
}
int res = max(distt[n], distc[n]);
if(res == inf) cout << -1;
else cout << res;
}