Submission

Status:

[PPPPPPPPPPPPPPPPPPPP]

Subtask/Task Score:

{100/100}

Score: 100

User: Test

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

Language: cpp

Time: 0.011 second

Submitted On: 2026-03-06 17:32:04

#include<bits/stdc++.h>
using namespace std;
//16.52-
int INF = 1e9;
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n,e;
    cin >> n >> e;
    vector<vector<pair<int,int>>> adj(n+1);
    vector<vector<char>> adj2(n+1,vector<char>(n+1,'R'));
    for(int i=0;i<n;i++) adj2[i][i]='X';
    for(int i=0;i<e;i++){
        int u,v;
        cin >> u >> v;
        int w = 10*abs(u-v);
        adj[u].push_back({v,w});
        adj[v].push_back({u,w});

        adj2[u][v]='T';
        adj2[v][u]='T';
    }
    vector<vector<pair<int,int>>> adj3(n+1);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(adj2[i][j]=='R'){
                int w = 10*abs(i-j);
                adj3[i].push_back({j,w});
                adj3[j].push_back({i,w});
            }
        }
    }
    //--------------------------------
    vector<int>dist(n+1,INF);
    priority_queue<pair<int,int>,vector<pair<int,int>>, greater<pair<int,int>>> pq;

    dist[1] = 0;
    pq.push({0,1});

    while(!pq.empty()){
        int du = pq.top().first;
        int u = pq.top().second;
        pq.pop();

        if(du>dist[u]) continue;

        for(auto &[v,w] : adj[u]){
            if(du+w<dist[v]){
                dist[v]=du+w;
                pq.push({dist[v],v});
            }
        }
    }
    //--------------------------------
    vector<int>dist3(n+1,INF);
    priority_queue<pair<int,int>,vector<pair<int,int>>, greater<pair<int,int>>> pq3;

    dist3[1] = 0;
    pq3.push({0,1});

    while(!pq3.empty()){
        int du = pq3.top().first;
        int u = pq3.top().second;
        pq3.pop();

        if(du>dist3[u]) continue;

        for(auto &[v,w] : adj3[u]){
            if(du+w<dist3[v]){
                dist3[v]=du+w;
                pq3.push({dist3[v],v});
            }
        }
    }
    //cout << dist[n] << " " << dist3[n];
    if(max(dist[n],dist3[n])==INF) cout << -1;
    else cout << max(dist[n],dist3[n]);

}