/* Author: ACb0y Date: 2010年9月16日12:09:35 Type: MST Kruskal ProblemId: hdu 1875 畅通工程再续 Result: 2960804 2010-09-16 12:10:08 Accepted 1875 312MS 496K 1715 B C++ ACb0y */ #include <iostream> #include <cmath> using namespace std; #define inf 999999999.9 struct Point { double x; double y; }; struct edge { int x; int y; double w; }; int n; int father[110]; Point points[110]; double g[110][110]; edge edges[10100]; double get_dis(int a, int b) { return sqrt((points[a].x - points[b].x) * (points[a].x - points[b].x) + (points[a].y - points[b].y) * (points[a].y - points[b].y)); } int find(int x) { if (x != father[x]) { return find(father[x]); } return x; } int cmp(const void * a, const void * b) { edge * pa = (edge *) a; edge * pb = (edge *) b; return pa->w > pb->w ? 1 : -1; } void MST_Kruskal(int n) { int i, j; for (i = 1; i <= n; i++) { father[i] = i; } int c = 0; for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { edges[c].w = g[i][j]; edges[c].x = i; edges[c].y = j; c++; } } double ans = 0; int flag = 1; qsort(edges, c, sizeof(edge), cmp); for (i = 0; i < c; i++) { int x = find(edges[i].x); int y = find(edges[i].y); if (x != y) { if (edges[i].w == inf) { flag = 0; break; } ans += edges[i].w; father[x] = y; } } if (flag) { printf("%.1lf/n", ans * 100); } else { printf("oh!/n"); } } int main() { int t; int i, j; #ifndef ONLINE_JUDGE freopen("1875.txt", "r", stdin); #endif cin >> n; while (n--) { cin >> t; for (i = 1; i <= t; i++) { scanf("%lf%lf", &points[i].x, &points[i].y); } for (i = 1; i <= t; i++) { for (j = 1; j <= t; j++) { double temp = get_dis(i, j); if (temp >= 10.0 && temp <= 1000.0) { g[i][j] = temp; } else { g[i][j] = inf; } } } MST_Kruskal(t); } return 0; }