Advertisement
mickypinata

TOI12: Pipe

Jul 16th, 2021 (edited)
1,133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.18 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef pair<int, int> pii;
  5. typedef tuple<int, int, int> tiii;
  6.  
  7. const int N = 15000;
  8.  
  9. vector<tiii> edges;
  10. int ds[N + 1], sz[N + 1], dist[N + 1], par[N + 1];
  11. pii coor[N + 1];
  12.  
  13. int distance(pii &a, pii &b){
  14.     int dx = a.first - b.first;
  15.     int dy = a.second - b.second;
  16.     return abs(dx) + abs(dy);
  17. }
  18.  
  19. int dsFind(int u){
  20.     if(ds[u] == u){
  21.         return u;
  22.     }
  23.     return ds[u] = dsFind(ds[u]);
  24. }
  25.  
  26. int main(){
  27.  
  28.     int nVertex, tr;
  29.     scanf("%d%d", &nVertex, &tr);
  30.     for(int i = 1; i <= nVertex; ++i){
  31.         scanf("%d%d", &coor[i].first, &coor[i].second);
  32.     }
  33.  
  34.     // Prim Algorithm
  35.     for(int i = 1; i <= nVertex; ++i){
  36.         ds[i] = i;
  37.         dist[i] = 1e9;
  38.     }
  39.     dist[1] = 0;
  40.     par[1] = 1;
  41.     for(int i = 0; i < nVertex; ++i){
  42.         int mnDist = 1e9;
  43.         int u = 0;
  44.         for(int j = 1; j <= nVertex - i; ++j){
  45.             if(dist[j] < mnDist){
  46.                 mnDist = dist[j];
  47.                 u = j;
  48.             }
  49.         }
  50.         edges.emplace_back(dist[u], ds[u], par[u]);
  51.         for(int v = 1; v <= nVertex - i; ++v){
  52.             if(u == v){
  53.                 continue;
  54.             }
  55.             int w = distance(coor[ds[u]], coor[ds[v]]);
  56.             if(w < dist[v]){
  57.                 dist[v] = w;
  58.                 par[v] = ds[u];
  59.             }
  60.         }
  61.         swap(ds[u], ds[nVertex - i]);
  62.         swap(dist[u], dist[nVertex - i]);
  63.         swap(par[u], par[nVertex - i]);
  64.     }
  65.  
  66.     // Kruskal Algorithm
  67.     sort(edges.begin(), edges.end());
  68.     for(int i = 1; i <= nVertex; ++i){
  69.         ds[i] = i;
  70.         sz[i] = 1;
  71.     }
  72.     int sum = 0;
  73.     int compCnt = nVertex;
  74.     for(tiii e : edges){
  75.         int w = get<0>(e);
  76.         int u = get<1>(e);
  77.         int v = get<2>(e);
  78.         u = dsFind(u);
  79.         v = dsFind(v);
  80.         if(u != v){
  81.             sum += w;
  82.             if(sz[u] < sz[v]){
  83.                 swap(u, v);
  84.             }
  85.             ds[v] = u;
  86.             sz[u] += sz[v];
  87.             --compCnt;
  88.             if(compCnt == tr){
  89.                 cout << sum;
  90.                 return 0;
  91.             }
  92.         }
  93.     }
  94.  
  95.     return 0;
  96. }
  97.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement