Submission

Status:
[P-SSSSSSSSSSSSSSSSSS]

Score: 0

User: noname

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

Language: cpp

Time: 0.002 second

Submitted On: 2025-03-30 15:40:45

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

int BFS(unordered_map<int, vector<pair<int, int>>>&g, int start, int end) {
    unordered_map<int, int> dist;
    queue<int> q;

    for(auto &[city, _] : g) {
        dist[city] = INT_MAX;
    }

    q.push(start);
    dist[start] = 0;

    while(!q.empty()) {
        int currCity = q.front();
        q.pop();

        for(auto &[neighbor, time] : g[currCity]) {
            int newTime = dist[currCity] + time;
            if(newTime < dist[neighbor]) {
                dist[neighbor] = newTime;
                q.push(neighbor);
            }
        }
    }

    return dist[end] == INT_MAX ? -1 : dist[end];
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int des, ways;
    cin >> des >> ways;

    unordered_map<int, vector<pair<int, int>>> trainGraph;
    unordered_map<int, vector<pair<int, int>>> carGraph;
    for(int i = 0; i < ways; i++) {
        int x, y;
        cin >> x >> y;
        trainGraph[x].push_back({y, abs(y - x) * 10});
        trainGraph[y].push_back({x, abs(y - x) * 10});
    }

    for(int i = 1; i <= des; i++) {
        for(int j = i + 1; j <= des; j++) {
            bool hasTrainPath = false;
            for(auto pair : trainGraph[i]) {
                if(pair.first == j) {
                    hasTrainPath = true;
                    break;
                }
            }

            if(!hasTrainPath) {
                carGraph[i].push_back({j, abs(j - i) * 10});
                carGraph[j].push_back({i, abs(j - i) * 10});
            }
        }
    }

    //do bfs to find min time by abs(y -x) * 10
    //we can also travel by car(there is car path when there aren't train path)
    int startCity = 1;
    int minTimeByTrain = BFS(trainGraph, startCity, des);
    int minTimeByCar = BFS(carGraph, startCity, des);

    if(minTimeByTrain == -1 || minTimeByCar == -1) {
        cout << "-1" << endl;
        return 0;
    }

    cout << max(minTimeByCar, minTimeByTrain) << endl;

    return 0;
}