結果
問題 | No.1065 電柱 / Pole (Easy) |
ユーザー | veqcc |
提出日時 | 2020-05-29 22:14:20 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 372 ms / 2,000 ms |
コード長 | 1,603 bytes |
コンパイル時間 | 1,226 ms |
コンパイル使用メモリ | 115,084 KB |
実行使用メモリ | 21,368 KB |
最終ジャッジ日時 | 2024-11-06 05:12:38 |
合計ジャッジ時間 | 8,931 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 46 |
ソースコード
#include <functional> #include <algorithm> #include <iostream> #include <iomanip> #include <cstring> #include <string> #include <vector> #include <random> #include <bitset> #include <queue> #include <cmath> #include <stack> #include <set> #include <map> typedef long long ll; using namespace std; const ll MOD = 1000000007LL; typedef pair <double, int> P; vector<double> dijkstra(vector<vector<P>> &edge, int s) { vector <double> dist(edge.size(), 1e18); priority_queue <P, vector<P>, greater<P>> q; q.push({0, s}); dist[s] = 0; while (!q.empty()) { P p = q.top(); q.pop(); int cur = p.second; double cost = p.first; if (dist[cur] < cost) continue; for (P nxt : edge[cur]) { int next_node = nxt.second; double cost_sum = cost + nxt.first; if (dist[next_node] > cost_sum) { dist[next_node] = cost_sum; q.push({cost_sum, next_node}); } } } return dist; } int main() { int n, m; cin >> n >> m; int x, y; cin >> x >> y; x--; y--; vector<int> p(n), q(n); for (int i = 0; i < n; i++) cin >> p[i] >> q[i]; vector<vector<P>> edge(n); for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; u--; v--; double diff = sqrt((p[u] - p[v]) * (p[u] - p[v]) + (q[u] - q[v]) * (q[u] - q[v])); edge[u].push_back({diff, v}); edge[v].push_back({diff, u}); } auto dist = dijkstra(edge, x); cout << fixed << setprecision(6) << dist[y] << endl; return 0; }