Submission
Status:
[PPPPPPPPPPPPPPPPPPPP]
Score: 100
User: Dormon
Problemset: รถยนต์ รถไฟ เรือเมล์ ลิเก ตำรวจ
Language: cpp
Time: 0.039 second
Submitted On: 2025-03-15 20:26:54
#include <iostream>
#include <vector>
#include <queue>
#include <functional>
using namespace std;
template<typename A, typename B> ostream& operator << (ostream &out, pair<A, B> a){
out << '{' << a.first << ", " << a.second << '}';
return out;
}
template<typename T> ostream& operator << (ostream &out, vector<T> v){
for (auto e:v)
out << e << ' ';
return out;
}
int main()
{
int n, m;
cin >> n >> m;
vector<vector<pair<int, int>>> adj1(n + 1), adj2(n + 1);
vector<vector<bool>> vis(n + 1, vector<bool>(n + 1, false));
for (int i = 0;i < m;i++){
int u, v, w;
cin >> u >> v;
adj1[u].push_back({v, 10 * abs(u - v)});
adj1[v].push_back({u, 10 * abs(u - v)});
vis[u][v] = vis[v][u] = true;
}
for (int i = 1;i <= n;i++)
for (int j = i + 1;j <= n;j++)
if (!vis[i][j]){
adj2[i].push_back({j, 10 * abs(i - j)});
adj2[j].push_back({i, 10 * abs(i - j)});
}
struct heap {
int u, w;
bool operator < (const heap &o) const {
return w > o.w;
}
};
vector<int> dist1(n + 1, 1e9), dist2(n + 1, 1e9);
auto dijkstra = [&](vector<vector<pair<int, int>>> adj, vector<int> &dist, int u) -> void {
priority_queue<heap> pq;
pq.push({u, 0});
while (!pq.empty()){
auto [u, W] = pq.top(); pq.pop();
if (dist[u] <= W) continue;
dist[u] = W;
for (auto [v, w]:adj[u])
pq.push({v, W + w});
}
};
dijkstra(adj1, dist1, 1);
dijkstra(adj2, dist2, 1);
// cout << "dist1 : " << dist1 << '\n';
// cout << "dist2 : " << dist2 << '\n';
// for (int i = 1;i <= n;i++)
// cout << "adj1[" << i << "] = " << adj1[i] << '\n';
// for (int i = 1;i <= n;i++)
// cout << "adj2[" << i << "] = " << adj2[i] << '\n';
if (dist1[n] == 1e9 || dist2[n] == 1e9)
cout << "-1\n";
else
cout << max(dist1[n], dist2[n]) << '\n';
}