#include <iostream>
#include <algorithm>
#include <cmath>
#include <iomanip>
using namespace std;
const int MAXN = 110;
int n;
double x[MAXN], y[MAXN];//x,y为点的坐标
struct Edge {
int a, b;
double w;
} edges[MAXN * MAXN]; //声明一个egde结构 保存edge的权值w。a,b 为边的两个节点
int fa[MAXN];// 定义一个整型数组 fa 来存储并查集中每个元素的父亲节点。
int find(int x) {
if (fa[x] != x) fa[x] = find(fa[x]);
return fa[x];
}
bool cmp(Edge a, Edge b) {
return a.w < b.w;
}
double kruskal() {
for (int i = 1; i <= n; i++) fa[i] = i;//Kruskal 算法的实现。首先初始化并查集,将每个元素的父亲节点设为自身。
sort(edges + 1, edges + n * (n - 1) / 2 + 1, cmp);
double ans = 0;
for (int i = 1; i <= n * (n - 1) / 2; i++) {
int a = find(edges[i].a), b = find(edges[i].b);
double w = edges[i].w;
if (a != b) {
ans += w;
fa[a] = b;
}
}
return ans;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) cin >> x[i] >> y[i];
int cnt = 0;
for (int i = 1; i <= n; i++)
for (int j = i + 1; j <= n; j++)
edges[++cnt] = {i, j, sqrt(pow(x[i] - x[j], 2) + pow(y[i] - y[j], 2))};//计算每两个 freckle 的距离,并存储为一条边。 建立edge集。
cout << fixed << setprecision(2) << kruskal() << endl;
return 0;
}