Submission

Status:

[PPPPPPPPPPPPPPPPPPPP]

Subtask/Task Score:

{100/100}

Score: 100

User: Neozaawwman1

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

Language: cpp

Time: 0.009 second

Submitted On: 2026-01-28 23:32:30

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 1e18;

int N, M;
vector<vector<int>> rail, road;

vector<ll> dijkstra(int start, vector<vector<int>>& g){
    vector<ll> dist(N+1, INF);
    priority_queue<pair<ll,int>> pq;

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

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

        if(w > dist[u]) continue;

        for(int v : g[u]){
            ll cost = 10LL * abs(v - u);
            if(dist[v] > w + cost){
                dist[v] = w + cost;
                pq.push({-dist[v], v});
            }
        }
    }
    return dist;
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> N >> M;

    rail.assign(N+1, {});
    road.assign(N+1, {});
    vector<vector<bool>> hasRail(N+1, vector<bool>(N+1, false));

    for(int i=0;i<M;i++){
        int a,b; cin >> a >> b;
        rail[a].push_back(b);
        rail[b].push_back(a);
        hasRail[a][b] = hasRail[b][a] = true;
    }

    // สร้างถนน = คู่ที่ไม่มีราง
    for(int i=1;i<=N;i++){
        for(int j=1;j<=N;j++){
            if(i==j) continue;
            if(!hasRail[i][j])
                road[i].push_back(j);
        }
    }

    auto distTrain = dijkstra(1, rail);
    auto distCar   = dijkstra(1, road);

    if(distTrain[N] == INF || distCar[N] == INF)
        cout << -1;
    else
        cout << max(distTrain[N], distCar[N]);

    return 0;
}