Submission

Status:

[PPPPPPPPPPPPPPPPPPPP]

Subtask/Task Score:

{100/100}

Score: 100

User: klalnwza007

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

Language: cpp

Time: 0.008 second

Submitted On: 2025-10-10 09:38:29

#include <bits/stdc++.h>
using namespace std;

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

    int N, M;
    if (!(cin >> N >> M)) return 0;

    // rail[u][v] = ???ҧ??????? (undirected)
    vector<vector<char>> rail(N+1, vector<char>(N+1, 0));
    for (int i = 0; i < M; ++i) {
        int U, V; cin >> U >> V;
        rail[U][V] = rail[V][U] = 1;
    }

    // ??????ҧ 1-N => ?? "???" (???????????ͧ rail)
    // ?????????ҧ 1-N => ?? "?ҧ"
    bool useRoad = rail[1][N];  // true -> ???ҿ???, false -> ???ҿ?ҧ

    const long long INF = (1LL<<60);
    vector<long long> dist(N+1, INF);
    vector<char> vis(N+1, 0);
    dist[1] = 0;

    // Dijkstra ????ҿ??????ҧẺ on-the-fly
    // ????? u-v ?????????:
    //   useRoad == true  => ??????ҧ (rail[u][v] == 0)
    //   useRoad == false => ???ҧ   (rail[u][v] == 1)
    priority_queue<pair<long long,int>, vector<pair<long long,int>>, greater<pair<long long,int>>> pq;
    pq.push({0,1});

    while (!pq.empty()) {
        auto [d,u] = pq.top(); pq.pop();
        if (vis[u]) continue;
        vis[u] = 1;
        if (u == N) break; // ??????????ش?ͧ N ????

        for (int v = 1; v <= N; ++v) {
            if (v == u) continue;
            bool edgeExists = useRoad ? (!rail[u][v]) : (rail[u][v]);
            if (!edgeExists) continue;

            long long w = 10LL * llabs(v - u);
            if (dist[v] > d + w) {
                dist[v] = d + w;
                pq.push({dist[v], v});
            }
        }
    }

    if (dist[N] >= INF/2) cout << -1 << '\n';
    else cout << dist[N] << '\n';

    return 0;
}