Submission

Status:

[PPPPPPPPPPPPPPPPPPPP]

Subtask/Task Score:

{100/100}

Score: 100

User: poni

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

Language: cpp

Time: 0.073 second

Submitted On: 2026-10-11 22:02:44

#include <bits/stdc++.h>

using namespace std;
#define int long long 
#define INF 2e15
#define vi vector<int>
#define pii pair<int, int>
#define piii tuple<int, int, int>

signed main() {
    cin.tie(0)->sync_with_stdio(0);

    int n, m;
    cin >> n >> m;

    vector<vector<pii>> v1(n+1);
    vector<vector<pii>> v2(n+1);
    set<pii> used;
    while (m--) {
        int a, b;
        cin >> a >> b;
        v1[a].emplace_back(b, 10*abs(b-a));
        v1[b].emplace_back(a, 10*abs(b-a));
        used.emplace(a, b);
        used.emplace(b, a);
    }

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (i == j) continue;
            if (used.count({i, j}) == 0) {
                v2[i].emplace_back(j, 10*abs(j-i));
            }
        }
    }

    auto djk = [&](const vector<vector<pii>> &v) {
        vi dist(n+1, INF);
        priority_queue<pii, vector<pii>, greater<pii>> pq;

        dist[1] = 0;
        pq.emplace(0, 1);

        while (!pq.empty()) {
            auto [cd, ci] = pq.top();
            pq.pop();

            if (cd > dist[ci]) continue;
            for (auto [ni, nd] : v[ci]) {
                if (cd + nd < dist[ni]) {
                    dist[ni] = cd + nd;
                    pq.emplace(dist[ni], ni);
                }
            }
        }
        return dist[n];
    };

    int ans = max(djk(v1), djk(v2));
    if (ans < INF) cout << ans;
    else cout << -1;
}