Submission

Status:

[PPPPPPPPPPPPPPPPPPPP]

Subtask/Task Score:

{100/100}

Score: 100

User: Shangbin

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

Language: cpp

Time: 0.009 second

Submitted On: 2026-03-19 22:36:55

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

#define pii pair<int, int>

const int maxn = 405, inf = 1e9;
int n, m, u, v, visited[maxn], parent[maxn], dist[maxn];
bool connect[maxn][maxn];
bool train_skip = 0;
vector<int> adj[maxn], adjcar[maxn];
priority_queue<pii, vector<pii>, greater<pii>> pq;

int main(){
    cin.tie(nullptr)->sync_with_stdio(0);
    cin >> n >> m;
    for (int i = 0; i < m; i++){
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
        connect[u][v] = 1;
        connect[v][u] = 1;
        if ((u == 1 && v == n) || (u == n && v == 1)) train_skip = 1;
    }
    if (train_skip){
        for (int i = 1; i <= n; i++){
            for (int j = 1; j <= n; j++){
                if (connect[i][j] || connect[j][i]) continue;
                adjcar[i].push_back(j);
            }
        }
    }
    for (int i = 0; i <= n; i++) dist[i] = inf;
    dist[1] = 0;
    pq.push({0, 1});
    while (!pq.empty()){
        auto [d, u] = pq.top(); pq.pop();
        if (visited[u]) continue;
        visited[u] = 1;
        if (train_skip){
            for (int v : adjcar[u]){
                int new_dist = dist[u] + (10 * abs(v - u));
                if (new_dist < dist[v]){
                    dist[v] = new_dist;
                    parent[v] = u;
                    pq.push({dist[v], v});
                }
            }
        }
        else {
            for (int v : adj[u]){
                int new_dist = dist[u] + (10 * abs(v - u));
                if (new_dist < dist[v]){
                    dist[v] = new_dist;
                    parent[v] = u;
                    pq.push({dist[v], v});
                }
            }
        }
    }
    if (!visited[n]) return cout << -1, 0;
    cout << dist[n] << '\n';
}