Advertisement
Dmaxiya

P8074 [COCI 2009/2010 #7] SVEMIR 参考代码

Mar 5th, 2025
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.75 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long LL;
  5. const int maxn = 300000 + 100;
  6. struct Edge {
  7.     int u, v, dis;
  8. };
  9.  
  10. bool operator<(const Edge &a, const Edge &b) {
  11.     return a.dis < b.dis;
  12. }
  13.  
  14. struct Node {
  15.     int x, y, z;
  16.     int idx;
  17. };
  18.  
  19. bool cmpX(const Node &a, const Node &b) {
  20.     return a.x < b.x;
  21. }
  22.  
  23. bool cmpY(const Node &a, const Node &b) {
  24.     return a.y < b.y;
  25. }
  26.  
  27. bool cmpZ(const Node &a, const Node &b) {
  28.     return a.z < b.z;
  29. }
  30.  
  31. int n, ecnt;
  32. LL ans;
  33. int fa[maxn];
  34. Node node[maxn];
  35. Edge edge[maxn];
  36.  
  37. void init() {
  38.     for (int i = 0; i < n; ++i) {
  39.         fa[i] = i;
  40.     }
  41. }
  42.  
  43. int findF(int x) {
  44.     return x == fa[x] ? x : fa[x] = findF(fa[x]);
  45. }
  46.  
  47. void union_(int x, int y) {
  48.     fa[findF(x)] = findF(y);
  49. }
  50.  
  51. int main() {
  52. #ifdef ExRoc
  53.     freopen("test.txt", "r", stdin);
  54. #endif // ExRoc
  55.     ios::sync_with_stdio(false);
  56.  
  57.     cin >> n;
  58.     for (int i = 0; i < n; ++i) {
  59.         cin >> node[i].x >> node[i].y >> node[i].z;
  60.         node[i].idx = i;
  61.     }
  62.     sort(node, node + n, cmpX);
  63.     for (int i = 1; i < n; ++i) {
  64.         edge[ecnt++] = {node[i].idx, node[i - 1].idx, node[i].x - node[i - 1].x};
  65.     }
  66.     sort(node, node + n, cmpY);
  67.     for (int i = 1; i < n; ++i) {
  68.         edge[ecnt++] = {node[i].idx, node[i - 1].idx, node[i].y - node[i - 1].y};
  69.     }
  70.     sort(node, node + n, cmpZ);
  71.     for (int i = 1; i < n; ++i) {
  72.         edge[ecnt++] = {node[i].idx, node[i - 1].idx, node[i].z - node[i - 1].z};
  73.     }
  74.     sort(edge, edge + ecnt);
  75.     init();
  76.     for (int i = 0; i < ecnt; ++i) {
  77.         if (findF(edge[i].u) != findF(edge[i].v)) {
  78.             union_(edge[i].u, edge[i].v);
  79.             ans += edge[i].dis;
  80.         }
  81.     }
  82.     cout << ans << endl;
  83.  
  84.     return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement