#include <iostream> #include <vector> #include <cmath> #include <algorithm> #include <iomanip> using namespace std; struct Edge { int u, v; double w; Edge(int u, int v, double w) : u(u), v(v), w(w) {} bool operator<(const Edge& other) const { return w < other.w; } }; vector<int> parent; int find(int x) { return parent[x] == x ? x : parent[x] = find(parent[x]); } void unite(int x, int y) { parent[find(x)] = find(y); } int main() { int n; cin >> n; vector<pair<double, double>> points(n); for (int i = 0; i < n; i++) { cin >> points[i].first >> points[i].second; } vector<Edge> edges; for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { double dx = points[i].first - points[j].first; double dy = points[i].second - points[j].second; double dist = sqrt(dx * dx + dy * dy); edges.emplace_back(i, j, dist); } } sort(edges.begin(), edges.end()); parent.resize(n); for (int i = 0; i < n; i++) parent[i] = i; double total = 0.0; for (const Edge& e : edges) { if (find(e.u) != find(e.v)) { unite(e.u, e.v); total += e.w; } } cout << fixed << setprecision(2) << total << endl; return 0; }