////////////////////////////////////////
// Problem : UVA 10034
////////////////////////////////////////
#include <iostream>
#include <stdio.h>
#include <vector>
#include <cctype>
#include <stdlib.h>
#include <numeric>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <queue>
#include <stack>
#include <iterator>
#include <set>
#include <sstream>
#include <map>
//#include <windows.h>
using namespace std;
#define FOR(i, a, b) for (int i = (a) ; i < (b); i++)
#define sz size()
#define pb push_back
#define clean(t) memset ((t) , -1, sizeof(t))
#define VI vector <int>
#define VS vector <string>
#define scan(n) scanf("%d", &n)
#define QI queue <int>
#define inf (1 << 29)
#define i_am_here cout << "I am here"
#define esp 1e-5
int points;
int pr[110];
struct co_ordinate{
float x;
float y;
};
struct edge{
int u, v;
float w;
};
vector <edge> e;
bool cmp(edge a, edge b)
{
return (a.w < b.w) ;
}
/*float val (float a)
{
return (a > 0 ) ? a : -a;
}*/
float lenth (co_ordinate a, co_ordinate b)
{
return sqrt( ((a.x-b.x)*(a.x-b.x)) + ((a.y - b.y)*(a.y - b.y)) );
}
int find(int r)
{
return (pr[r] == r)? r:find(pr[r]);
}
float mst(int n)
{
int i;
FOR(i, 1, n+1) pr[i] = i;
sort(e.begin(), e.end(), cmp);
int count = 0;
float sum;
for (int j = 0; j < (int) e.sz; j++)
{
int x = find(e[j].u);
int y = find(e[j].v);
if(x!=y)
{
pr[x] = y;
sum = sum +e[j].w;
count++;
if(count == n-1) break;
}
}
return sum;
}
co_ordinate storer[110];
int main()
{
int t;
cin >> t;
int i;
FOR(i, 1 , t+1)
{
cin >> points;
int j;
FOR(j, 1, points + 1)
{
co_ordinate a;
float p, q;
cin >> p >> q;
a.x = p; a.y = q;
storer[j] = a;
}
int r, s;
for (r = 1; r <= points-1; r++)
{
for(s = r+1; s <= points; s++)
{
edge get;
get.u = r; get.v = s;
get.w = lenth(storer[r], storer[s]);
e.pb(get);
}
}
cout << fixed;
cout.precision(2);
cout << mst(points) +esp << endl;
e.clear();
if(i!=t)cout << endl;
//END OF TESTCASE
}
return 0;
}
ICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vICBQcm9ibGVtIDogVVZBIDEwMDM0CiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgI2luY2x1ZGUgPGlvc3RyZWFtPgogICAgI2luY2x1ZGUgPHN0ZGlvLmg+CiAgICAjaW5jbHVkZSA8dmVjdG9yPgogICAgI2luY2x1ZGUgPGNjdHlwZT4KICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KICAgICNpbmNsdWRlIDxudW1lcmljPgogICAgI2luY2x1ZGUgPHN0cmluZy5oPgogICAgI2luY2x1ZGUgPGFsZ29yaXRobT4KICAgICNpbmNsdWRlIDxtYXRoLmg+CiAgICAjaW5jbHVkZSA8cXVldWU+CiAgICAjaW5jbHVkZSA8c3RhY2s+CiAgICAjaW5jbHVkZSA8aXRlcmF0b3I+CiAgICAjaW5jbHVkZSA8c2V0PgogICAgI2luY2x1ZGUgPHNzdHJlYW0+CiAgICAjaW5jbHVkZSA8bWFwPgogICAgLy8jaW5jbHVkZSA8d2luZG93cy5oPgogICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiAgICAjZGVmaW5lIEZPUihpLCBhLCBiKSBmb3IgKGludCBpID0gKGEpIDsgaSA8IChiKTsgaSsrKQogICAgI2RlZmluZSBzeiBzaXplKCkKICAgICNkZWZpbmUgcGIgcHVzaF9iYWNrCiAgICAjZGVmaW5lIGNsZWFuKHQpIG1lbXNldCAoKHQpICwgLTEsIHNpemVvZih0KSkKICAgICNkZWZpbmUgVkkgdmVjdG9yIDxpbnQ+CiAgICAjZGVmaW5lIFZTIHZlY3RvciA8c3RyaW5nPgogICAgI2RlZmluZSBzY2FuKG4pIHNjYW5mKCIlZCIsICZuKQogICAgI2RlZmluZSBRSSBxdWV1ZSA8aW50PgogICAgI2RlZmluZSBpbmYgKDEgPDwgMjkpCiAgICAjZGVmaW5lIGlfYW1faGVyZSBjb3V0IDw8ICJJIGFtIGhlcmUiCiAgICAjZGVmaW5lIGVzcCAxZS01CiAgICBpbnQgcG9pbnRzOwogICAgaW50IHByWzExMF07CgoKICAgIHN0cnVjdCBjb19vcmRpbmF0ZXsKICAgICAgICBmbG9hdCB4OwogICAgICAgIGZsb2F0IHk7CiAgICB9OwoKICAgIHN0cnVjdCBlZGdlewogICAgICAgIGludCB1LCB2OwogICAgICAgIGZsb2F0IHc7CgogICAgfTsKCiAgICB2ZWN0b3IgPGVkZ2U+IGU7CgogICAgYm9vbCBjbXAoZWRnZSBhLCBlZGdlIGIpCiAgICB7CiAgICAgICByZXR1cm4gKGEudyA8IGIudykgOwogICAgfQoKICAgIC8qZmxvYXQgdmFsIChmbG9hdCBhKQogICAgewogICAgICAgIHJldHVybiAoYSA+IDAgKSA/IGEgOiAtYTsKICAgIH0qLwoKCiAgICBmbG9hdCBsZW50aCAoY29fb3JkaW5hdGUgYSwgY29fb3JkaW5hdGUgYikKICAgIHsKICAgICAgICByZXR1cm4gc3FydCggKChhLngtYi54KSooYS54LWIueCkpICsgKChhLnkgLSBiLnkpKihhLnkgLSBiLnkpKSApOwogICAgfQoKICAgIGludCBmaW5kKGludCByKQogICAgewogICAgICAgIHJldHVybiAocHJbcl0gPT0gcik/IHI6ZmluZChwcltyXSk7CiAgICB9CgoKCiAgICBmbG9hdCBtc3QoaW50IG4pCiAgICB7CiAgICAgICAgaW50IGk7CiAgICAgICAgRk9SKGksIDEsIG4rMSkgIHByW2ldID0gaTsKICAgICAgICBzb3J0KGUuYmVnaW4oKSwgZS5lbmQoKSwgY21wKTsKCiAgICAgICAgaW50IGNvdW50ID0gMDsKICAgICAgICBmbG9hdCBzdW07CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAoaW50KSBlLnN6OyBqKyspCiAgICAgICAgewogICAgICAgICAgICBpbnQgeCA9IGZpbmQoZVtqXS51KTsKICAgICAgICAgICAgaW50IHkgPSBmaW5kKGVbal0udik7CgogICAgICAgICAgICBpZih4IT15KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwclt4XSA9IHk7CiAgICAgICAgICAgICAgICBzdW0gPSBzdW0gK2Vbal0udzsKICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICBpZihjb3VudCA9PSBuLTEpICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gc3VtOwogICAgfQoKCiAgICBjb19vcmRpbmF0ZSBzdG9yZXJbMTEwXTsKCiAgICBpbnQgbWFpbigpCiAgICB7CgogICAgICAgIGludCB0OwogICAgICAgIGNpbiA+PiB0OwogICAgICAgIGludCBpOwogICAgICAgIEZPUihpLCAxICwgdCsxKQogICAgICAgIHsKICAgICAgICAgICAgY2luID4+IHBvaW50czsKICAgICAgICAgICAgaW50IGo7CiAgICAgICAgICAgIEZPUihqLCAxLCBwb2ludHMgKyAxKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb19vcmRpbmF0ZSBhOwogICAgICAgICAgICAgICAgZmxvYXQgcCwgcTsKICAgICAgICAgICAgICAgIGNpbiA+PiBwID4+IHE7CiAgICAgICAgICAgICAgICBhLnggPSBwOyBhLnkgPSBxOwoKICAgICAgICAgICAgICAgIHN0b3JlcltqXSA9IGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGludCByLCBzOwogICAgICAgICAgICBmb3IgKHIgPSAxOyByIDw9IHBvaW50cy0xOyByKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvcihzID0gcisxOyBzIDw9IHBvaW50czsgcysrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGVkZ2UgZ2V0OwogICAgICAgICAgICAgICAgICAgIGdldC51ID0gcjsgZ2V0LnYgPSBzOwogICAgICAgICAgICAgICAgICAgIGdldC53ID0gbGVudGgoc3RvcmVyW3JdLCBzdG9yZXJbc10pOwogICAgICAgICAgICAgICAgICAgIGUucGIoZ2V0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjb3V0IDw8IGZpeGVkOwogICAgICAgICAgICBjb3V0LnByZWNpc2lvbigyKTsKCiAgICAgICAgICAgY291dCA8PCAgbXN0KHBvaW50cykgK2VzcCA8PCBlbmRsOwogICAgICAgICAgIGUuY2xlYXIoKTsKCiAgICAgICAgICAgaWYoaSE9dCljb3V0IDw8IGVuZGw7CgogICAgICAgICAgIC8vRU5EIE9GIFRFU1RDQVNFCiAgICAgICAgfQoKICAgICAgICByZXR1cm4gMDsKICAgIH0K