1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
#include<algorithm> #include<utility> #include<cmath> #define N 500 using namespace std; typedef pair<int, int> Coord;
struct { int a, b; double dis; bool operator<(const Edge& e){ return dis < e.dis; }
}edge[126000]; int p[N]; inline void init(int n); inline int find(int a); inline void Union(int a, int b); inline double getDistance(Coord& a, Coord& b); double kruskal(int V, int E, int S); int main() { Coord coord[N]; int Case; scanf("%d", &Case); while (Case--) { int S, P, i; scanf("%d%d", &S, &P); for (i = 0; i < P; i++) scanf("%d%d", &coord[i].first, &coord[i].second);
int e = 0; for (i = 0; i < P; i++) for (int j = i + 1; j < P; j++) { edge[e].a = i; edge[e].b = j; edge[e++].dis = getDistance(coord[i], coord[j]); }
printf("%.2lfn", kruskal(P, e, S)); }
return 0; } double getDistance(Coord& a, Coord& b) { return sqrt((a.first - b.first)*(a.first - b.first) + (a.second - b.second)*(a.second - b.second)); }
void init(int n) { for (int i = 0; i < n; i++) p[i] = i; } int find(int a) { return a == p[a] ? a : (p[a] = find(p[a])); } void Union(int a, int b) { p[find(a)] = find(b); } double kruskal(int V, int E, int S) { init(V); sort(edge, edge + E); double D = 0;
for (int i = 1, e = 0; i < V - (S - 1) && e < E; i++) { while (find(edge[e].a) == find(edge[e].b)) e++;
Union(edge[e].a, edge[e].b);
D = edge[e].dis;
e++; }
return D; }
|
近期评论