#include #define rep(i, n) for (int i = 0; i < n; i++) using namespace std; typedef long long ll; typedef pair P; struct edge { ll to; double cost; }; const int MAX_V =200000; const ll INF = 1LL<<60; int V; vector G[MAX_V]; double d[MAX_V]; void dijkstra(ll s) { // greater

を指定することでfirstが小さい順に取り出せるようにする priority_queue, greater

> que; fill(d, d + V, INF); d[s] = 0; que.push(P(0, s)); while (!que.empty()) { P p = que.top(); que.pop(); int v = p.second; if (d[v] < p.first) continue; rep(i,G[v].size()) { edge e = G[v][i]; if (d[e.to] > d[v] + e.cost) { d[e.to] = d[v] + e.cost; que.push(P(d[e.to], e.to)); } } } } int main() { int M, X, Y, P, Q; cin >> V >> M >> X >> Y; vector p(V), q(V); rep(i, V) cin >> p[i] >> q[i]; rep(i, M) { cin >> P >> Q; P--; Q--; double dx = p[P] - p[Q]; double dy = q[P] - q[Q]; double dist = sqrt(dx * dx + dy * dy); G[P].push_back({Q, dist}); G[Q].push_back({P, dist}); } dijkstra(X - 1); cout << fixed << setprecision(20) << d[Y - 1] << "\n"; }