#include <iostream> #include <cmath> using namespace std; const int MAXN = 100; enum Ifexist {R, U}; // Remain-set and U-set // U集合表示最终为MST节点的集合 // Remain集合表示当前还剩元素 struct Point { double x, y; Ifexist ife; }; Point r[MAXN];//REMAIN bool isempty(int n, Point s[]);// 谓词:判断Remain集合是否为空 inline double calculateD(Point a, Point b); int main() { double x, y; int n; int keepi; double kmin, ans; while (cin >> n) { ans = 0; for (int i = 0; i < n; ++i) { cin >> x >> y; r[i].x = x; r[i].y = y; r[i].ife = R; } r[0].ife = U; while (!isempty(n, r)) { kmin = 100000; // On^2 计算R和U 集合最近元素距离 for (int i = 0; i < n; ++i) { if (r[i].ife == R) { for (int j = 0; j < n; ++j) { if (r[j].ife == U) { double dst = calculateD(r[i], r[j]); if (dst < kmin) { kmin = dst; keepi = i; } } } } } ans += kmin;// 累加R和U集合最近的边 r[keepi].ife = U;//R节点数目减一,也意味着U集合加一 } cout.precision(2); //cout<<ans<<endl; printf("%.2f\n", ans); } return 0; } bool isempty(int n, Point s[]) { for (int i = 0; i < n; ++i) { if (s[i].ife == R) return false; } return true; } inline double calculateD(Point a, Point b) { return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)); }