#include <iostream> #include <vector> #include <algorithm> #include <math.h> using namespace std; int father[1010]; int height[1010]; struct Dot { double x; double y; }; struct Edge { int from; int to; double weight; }; vector<Dot> v; vector<Edge> G; void Init(int n) { for (int i = 1; i <= n; i++) { father[i] = i; height[i] = 1; } } int find(int x) { if (x != father[x]) { father[x] = find(father[x]); } return father[x]; } void Union(int x, int y, double weight, double &total) { x = find(x); y = find(y); if (x != y) { total += weight; if (height[x] < height[y]) { father[x] = y; } else if (height[x] > height[y]) { father[y] = x; } else { father[y] = x; height[x]++; } } } double getdis(Dot x, Dot y) { return pow((x.x - y.x) * (x.x - y.x) + (x.y - y.y) * (x.y - y.y), 0.5); } bool compare(Edge l, Edge r) { return l.weight < r.weight; } int main() { int n; scanf("%d", &n); Init(n); for (int i = 0; i < n; i++) { Dot d; scanf("%lf%lf", &d.x, &d.y); v.push_back(d); } for (int i = 0; i < v.size() - 1; i++) { Edge edge; for (int j = i + 1; j < v.size(); j++) { edge.from = i; edge.to = j; edge.weight = getdis(v[i], v[j]); G.push_back(edge); } } sort(G.begin(), G.end(), compare); double total = 0; for (int i = 0; i < G.size(); i++) { Union(G[i].from, G[i].to, G[i].weight, total); } printf("%.2lf\n", total); return 0; }