main.cc 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include <cmath>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <queue>
  5. using namespace std;
  6. const int N = 200;
  7. struct UF {
  8. int id[N];
  9. int sz[N];
  10. int cnt;
  11. } uf;
  12. int find(int i) {
  13. if (i == uf.id[i]) return i;
  14. int j = find(uf.id[i]);
  15. uf.id[i] = j;
  16. return j;
  17. }
  18. bool is_join(int i, int j) { return find(i) == find(j); }
  19. void join(int i, int j) {
  20. i = find(i);
  21. j = find(j);
  22. if (i == j) return;
  23. if (uf.sz[i] < uf.sz[j]) {
  24. uf.id[i] = j;
  25. } else {
  26. if (uf.sz[i] == uf.sz[j]) uf.sz[i]++;
  27. uf.id[j] = i;
  28. }
  29. uf.cnt--;
  30. }
  31. struct V {
  32. double x;
  33. double y;
  34. double operator-(const V &that) const {
  35. double dx = this->x - that.x;
  36. double dy = this->y - that.y;
  37. return sqrt(dx * dx + dy * dy);
  38. }
  39. } v[N];
  40. struct E {
  41. int v1;
  42. int v2;
  43. double len;
  44. E(int v1, int v2, double len) : v1(v1), v2(v2), len(len) {}
  45. bool operator<(const E &that) const { return this->len > that.len; }
  46. };
  47. int main() {
  48. int n, e;
  49. scanf("%d", &n);
  50. for (int i = 0; i < n; i++) scanf("%lf %lf", &v[i].x, &v[i].y);
  51. priority_queue<E> q;
  52. for (int i = 0; i < n - 1; i++) {
  53. for (int j = i + 1; j < n; j++) {
  54. q.push(E(i, j, v[i] - v[j]));
  55. e++;
  56. }
  57. }
  58. for (int i = 0; i < n; i++) uf.id[i] = i;
  59. memset(uf.sz, 0, sizeof(uf.sz));
  60. uf.cnt = n;
  61. double len = 0.;
  62. while (uf.cnt != 1) {
  63. E edge = q.top();
  64. q.pop();
  65. if (is_join(edge.v1, edge.v2)) continue;
  66. join(edge.v1, edge.v2);
  67. len += edge.len;
  68. }
  69. printf("%.2lf\n", len);
  70. return 0;
  71. }