Advertisement
mickypinata

CUBE-T199: Sagittarius A*

Jul 12th, 2021
714
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.66 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long lli;
  5. typedef tuple<int, int, int, int> tpp;
  6.  
  7. const int N = 1e5;
  8.  
  9. vector<tpp> edges;
  10. vector<int> chosen;
  11. int ds[N + 1], sz[N + 1];
  12.  
  13. int dsFind(int u){
  14.     if(ds[u] == u){
  15.         return u;
  16.     }
  17.     return ds[u] = dsFind(ds[u]);
  18. }
  19.  
  20. int main(){
  21.  
  22.     int nVertex, nEdge;
  23.     scanf("%d%d", &nVertex, &nEdge);
  24.     for(int i = 1; i <= nEdge; ++i){
  25.         int u, v, w;
  26.         scanf("%d%d%d", &u, &v, &w);
  27.         edges.emplace_back(w, u, v, i);
  28.     }
  29.     sort(edges.begin(), edges.end(), greater<tpp>());
  30.  
  31.     for(int i = 1; i <= nVertex; ++i){
  32.         ds[i] = i;
  33.         sz[i] = 1;
  34.     }
  35.  
  36.     lli sum = 0;
  37.     bool lastOne = false;
  38.     for(tpp e : edges){
  39.         int w = get<0>(e);
  40.         int u = get<1>(e);
  41.         int v = get<2>(e);
  42.         int i = get<3>(e);
  43.         u = dsFind(u);
  44.         v = dsFind(v);
  45.         if(u != v){
  46.             sum += w;
  47.             if(sz[u] < sz[v]){
  48.                 swap(u, v);
  49.             }
  50.             ds[v] = u;
  51.             sz[u] += sz[v];
  52.             chosen.push_back(i);
  53.         } else if(!lastOne){
  54.             sum += w;
  55.             lastOne = true;
  56.             chosen.push_back(i);
  57.         }
  58.     }
  59.  
  60.     bool connected = true;
  61.     for(int i = 1; i < nVertex; ++i){
  62.         if(dsFind(i) != dsFind(i + 1)){
  63.             connected = false;
  64.             break;
  65.         }
  66.     }
  67.     if(!connected || !lastOne){
  68.         cout << "-1";
  69.         return 0;
  70.     }
  71.  
  72.     int cmd;
  73.     scanf("%d", &cmd);
  74.     cout << sum << '\n';
  75.     if(cmd == 2){
  76.         for(int x : chosen){
  77.             cout << x << ' ';
  78.         }
  79.     }
  80.  
  81.     return 0;
  82. }
  83.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement