#include <iostream>
#include <cmath>
#include <cstring>
#include <map>
#include <list>
#include <iomanip>
#include <queue>
#include <stack>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
#define INF 0x7fffffff
#define dps 10e-6
struct Point
{
int x, y;
}P[10000];
struct E
{
Point S, E;
int tag1, tag2;
double D;
}Edge[10000];
int f[10000];
int cmp(E A, E B);
double Distance(Point A, Point B);
int getf(int v);
int Merge(int u, int v);
int main()
{
std::ios::sync_with_stdio(NULL);
int T, C, Count;
double sum;
cin >> T;
while(T--)
{
for(int i = 0; i < 1000; i++)
f[i] = i;
int CE = 0;
Count = 0, sum = 0.0;
cin >> C;
for(int i = 0; i < C; i++)
cin >> P[i].x >> P[i].y;
for(int i = 0; i < C - 1; i++)
{
for(int j = i + 1; j < C; j++)
{
Edge[CE].tag1 = i;
Edge[CE].tag2 = j;
Edge[CE].S = P[i];
Edge[CE].E = P[j];
Edge[CE].D = Distance(P[i], P[j]);
CE++;
}
}
//cout << "CE ==== " << CE << endl;
sort(Edge, Edge + CE, cmp);
for(int i = 0; i < CE; i++)
{
if(Edge[i].D >= 10 && Edge[i].D <= 1000 && Merge(Edge[i].tag1, Edge[i].tag2))
{
sum += 100 * Edge[i].D;
Count++;
}
if(Count == C - 1)
break;
}
//cout << "Count ====" << Count << endl;
if(Count == C - 1)
cout << fixed << setprecision(1) << sum << endl;
else
cout << "oh!" <<endl;
}
return 0;
}
double Distance(Point A, Point B)
{
double a = A.x - B.x;
double b = A.y - B.y;
return (double)sqrt(a * a + b * b);
}
int getf(int v)
{
if(f[v] == v)
return v;
else
{
f[v] = getf(f[v]);
return f[v];
}
}
int Merge(int u, int v)
{
int t1 = getf(u);
int t2 = getf(v);
if(t1 != t2)
{
f[t2] = t1;
return 1;
}
else
return 0;
}
int cmp(E A, E B)
{
return A.D < B.D;
}
N - 畅通工程再续 (最小生成树)
最新推荐文章于 2020-06-06 17:41:25 发布