結果
| 問題 |
No.1065 電柱 / Pole (Easy)
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-05-30 15:14:22 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 363 ms / 2,000 ms |
| コード長 | 1,550 bytes |
| コンパイル時間 | 2,680 ms |
| コンパイル使用メモリ | 194,988 KB |
| 実行使用メモリ | 31,332 KB |
| 最終ジャッジ日時 | 2024-11-07 17:41:01 |
| 合計ジャッジ時間 | 11,928 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 46 |
ソースコード
#pragma GCC optimize("O3", "unroll-loops")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
template<typename T>
vector<T> dijkstra(int s, vector<vector<pair<int, T>>> &G){
const int n = G.size();
vector<T> d(n, numeric_limits<T>::max());
vector<int> b(n, -1);
priority_queue<pair<T, int>, vector<pair<T, int>>, greater<pair<T, int>>> q;
d[s] = 0;
q.emplace(d[s], s);
while (!q.empty()){
pair<T, int> p = q.top();
q.pop();
int v = p.second;
if (d[v] < p.first) continue;
for (auto& e : G[v]){
int u = e.first;
T c = e.second;
if (d[u] > d[v] + c){
d[u] = d[v] + c;
b[u] = v;
q.emplace(d[u], u);
}
}
}
return d;
}
int N, M;
int X, Y;
vector<pair<int, int>> pq;
void input(void){
cin >> N >> M;
pq.resize(N);
cin >> X >> Y;
--X, --Y;
for (int i = 0; i < N; ++i)
cin >> pq[i].first >> pq[i].second;
}
ld dist(int a, int b){
int dx = pq[a].first - pq[b].first;
int dy = pq[a].second - pq[b].second;
return sqrtl(dx * dx + dy * dy);
}
int main(void){
input();
vector<vector<pair<int, ld>>> g(N);
for (int i = 0; i < M; ++i){
int P, Q; cin >> P >> Q;
--P, --Q;
ld cost = dist(P, Q);
g[P].emplace_back(Q, cost);
g[Q].emplace_back(P, cost);
}
auto d = dijkstra(X, g);
cout << setprecision(15) << d[Y] << endl;
return 0;
}