Submission

Status:

[PPPPPPPPPPPPPPPPPPPP]

Subtask/Task Score:

{100/100}

Score: 100

User: Zonezonee

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

Language: cpp

Time: 0.110 second

Submitted On: 2025-12-13 18:39:46

#include <bits/stdc++.h>
using namespace std;
const int N = 4e2+10;

int n, m;
int dist1[N][N], dist2[N][N];
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n >> m;
    memset(dist1, 0x3f, sizeof dist1);
    memset(dist2, 0x3f, sizeof dist2);
    while(m--){
        int u, v;
        cin >> u >> v;
        dist1[u][v] = dist1[v][u] = abs(u-v);
    }
    for(int i = 1; i <= n; ++i){
        for(int j = 1; j <= n; ++j){
            if(dist1[i][j] == 0x3f3f3f3f){
                dist2[i][j] = dist2[j][i] = abs(j-i);
            }
        }
    }
    
    for(int k = 1; k <= n; ++k){
        for(int i = 1; i <= n; ++i){
            for(int j = 1; j <= n; ++j){
                dist1[i][j] = min(dist1[i][j], dist1[i][k] + dist1[k][j]);
            }
        }
    }
    for(int k = 1; k <= n; ++k){
        for(int i = 1; i <= n; ++i){
            for(int j = 1; j <= n; ++j){
                // if(i == 1 && dist2[i][k] + dist2[k][j] == dist1[i][j]) continue;
                dist2[i][j] = min(dist2[i][j], dist2[i][k] + dist2[k][j]);
            }
        }
    }
    int ans = max(dist1[1][n], dist2[1][n]);
    cout << (ans == 0x3f3f3f3f ? -1 : 10*ans);
}