Submission
Status:
[P-SSSSSSSSSSSSSSSSSS]
Score: 0
User: AungS8430
Problemset: รถยนต์ รถไฟ เรือเมล์ ลิเก ตำรวจ
Language: cpp
Time: 0.002 second
Submitted On: 2025-03-16 12:07:45
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
#include <tuple>
#include <set>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<vector<pair<int, int>>> train_adj(n + 1);
vector<vector<pair<int, int>>> car_adj(n + 1);
for (int i = 0; i < m; ++i) {
int u, v;
cin >> u >> v;
int weight = 10 * abs(u - v);
train_adj[u].push_back({v, weight});
train_adj[v].push_back({u, weight});
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
if (i != j) {
int weight = 10 * abs(i - j);
car_adj[i].push_back({j, weight});
}
}
}
priority_queue<tuple<int, int, int, int>, vector<tuple<int, int, int, int>>, greater<tuple<int, int, int, int>>> pq;
pq.push({0, 0, 1, 1});
set<tuple<int, int, int, int>> visited;
int min_time = -1;
while (!pq.empty()) {
int car_time, train_time, car_city, train_city;
tie(car_time, train_time, car_city, train_city) = pq.top();
pq.pop();
if (car_city == n && train_city == n) {
min_time = max(car_time, train_time);
break;
}
if (visited.count({car_city, train_city, car_time, train_time})) {
continue;
}
visited.insert({car_city, train_city, car_time, train_time});
for (auto& car_next : car_adj[car_city]) {
int next_car_city = car_next.first;
int next_car_time = car_time + car_next.second;
for (auto& train_next : train_adj[train_city]) {
int next_train_city = train_next.first;
int next_train_time = train_time + train_next.second;
if ((next_car_city != next_train_city || (next_car_city == n && next_train_city == n))) {
pq.push({next_car_time, next_train_time, next_car_city, next_train_city});
}
}
}
}
cout << min_time << endl;
return 0;
}