Submission

Status:
[PPPPPPPPPPPPPPPPP-SS]

Score: 0

User: fluke

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

Language: cpp

Time: 0.022 second

Submitted On: 2025-03-14 20:29:58

#include <bits/stdc++.h>
#define ll long long 
#define f first 
#define s second 
#define pii pair<int,int>
#define piii tuple <int,int,int> 
#define emb emplace_back
#define em emplace 
#define all(x) x.begin(),x.end()
#define sp <<" "<<
#define DB cout<<"\n";system("pause");
using namespace std;

int inf = 2e9;
int mod = 1e9+7;

int di[] = {0,1,0,-1};
int dj[] = {1,0,-1,0};

int main(){
ios::sync_with_stdio(false);cin.tie(0);
    int n,m;
    cin>>n>>m;
    vector <vector <bool>> adj_m(n+1 , vector <bool> (n+1));
    vector <vector <int>> adj_t(n+1),adj_c(n+1);

    for(int i=0;i<m;i++){
        int x,y;
        cin>>x>>y;
        adj_m[x][y] = true;
        adj_m[y][x] = true;

        adj_t[x].emb(y);
        adj_t[y].emb(x);
    }

    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            if(!adj_m[i][j]){
                adj_c[i].emb(j);
                adj_c[j].emb(i);
            }
        }
    }
    
    vector <int> dis_train(n+1,2e9) , dis_car(n+1,2e9);
    priority_queue <pii , vector <pii> , greater <pii>> pq;

    pq.em(0,1);
    while(!pq.empty()){
        auto [dis_now , node_now]  = pq.top();
        pq.pop();

        if(dis_now >= dis_train[node_now])continue;
        dis_train[node_now] = dis_now;

        for(auto x : adj_t[node_now]){
            if(dis_train[x] <= dis_now + 10 * abs(node_now - x))continue;
            pq.em(dis_now + 10 * abs(node_now - x) , x);
        }
    }

    pq.em(0,1);
    while(!pq.empty()){
        auto [dis_now , node_now]  = pq.top();
        pq.pop();

        if(dis_now >= dis_car[node_now])continue;
        dis_car[node_now] = dis_now;

        for(auto x : adj_c[node_now]){
            if(x == n){
                if(dis_car[x] <= dis_now + 10 * abs(node_now - x))continue;
                pq.em(dis_now + 10 * abs(node_now - x)  , x);
            }
            else {
                if(dis_car[x] <= dis_now + 10 * abs(node_now - x) || dis_train[x] == dis_now + 10 * abs(node_now - x))continue;
                pq.em(dis_now + 10 * abs(node_now - x) ,x);

            }
        }
    }

    int use = max(dis_train[n] , dis_car[n]);
    if(use == inf)cout<<"-1";
    else cout<<use;


}