Advertisement
SuitNdtie

CUBE-199: Sagittarius A*

May 20th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.80 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<algorithm>
  3. #include<set>
  4. using namespace std;
  5.  
  6. typedef long long int ll;
  7. struct edge{
  8.     int u,v,idx;
  9.     ll w;
  10. };
  11.  
  12. bool mycmp(edge a,edge b){
  13.     return a.w > b.w;
  14. }
  15.  
  16. int parent[100010];
  17.  
  18. int finds(int x){
  19.     if(parent[x] == x){
  20.         return x;
  21.     }
  22.     return parent[x] = finds(parent[x]);
  23. }
  24.  
  25. void unions(int x,int y){
  26.     int rx = finds(x);
  27.     int ry = finds(y);
  28.     parent[ry] = rx;
  29. }
  30.  
  31. int main()
  32. {
  33.     for(int i = 0 ; i < 100010 ; i ++){
  34.         parent[i] = i;
  35.     }
  36.     int n,m;
  37.     scanf("%d %d",&n,&m);
  38.    
  39.     edge elist[m+1];
  40.     bool echeck[m+1];
  41.     for(int i = 1 ; i <= m ; i ++){
  42.         int u,v;
  43.         ll w;
  44.         scanf("%d %d %lld",&u,&v,&w);
  45.         if(u > v){ //swapping
  46.             int temp = u;
  47.             u = v;
  48.             v = temp;
  49.         }
  50.         elist[i] = {u,v,i,w};
  51.         echeck[i] = false;
  52.     }
  53.     sort(elist+1,elist+m+1,mycmp);
  54.     set<pair<int,int> > myset;
  55.    
  56.     int cnte = 0;
  57.     ll sum = 0;
  58.     int ans[m];
  59.     int aI = 0;
  60.     //mst
  61.     for(int i = 1 ; i <= m ; i ++){
  62.         int u = elist[i].u;
  63.         int v = elist[i].v;
  64.         ll w = elist[i].w;
  65.         int idx = elist[i].idx;
  66.    
  67.         if(finds(u) != finds(v)){
  68.             unions(u,v);
  69.             sum += w;
  70.             cnte++;
  71.             ans[aI++] = idx;
  72.             echeck[i] = true;
  73.             myset.insert({u,v});
  74.         }
  75.     }
  76. //  return 0;
  77.     int T;
  78.     scanf("%d",&T);
  79.     if(cnte != n - 1){ //not spanning
  80.         printf("-1");
  81.         return 0;
  82.     }
  83.     //building in greedy
  84.     for(int i = 1 ; i <= m && cnte < n ; i ++){
  85.         if(!echeck[i]){
  86.             int u = elist[i].u;
  87.             int v = elist[i].v;
  88.             ll w = elist[i].w;
  89.             int idx = elist[i].idx;
  90.             if(myset.find({u,v}) == myset.end()){
  91.                 sum += w;
  92.                 cnte++;
  93.                 ans[aI++] = idx;
  94.                 echeck[i] = true;
  95.                 myset.insert({u,v});
  96.             }
  97.         }
  98.     }
  99.    
  100.    
  101.    
  102.     if(cnte != n){
  103.         printf("-1");
  104.         return 0;
  105.     }
  106.     printf("%lld",sum);
  107.     if(T == 2){
  108.         printf("\n");
  109.         for(int i = 0 ; i < aI ; i ++){
  110.             printf("%d ",ans[i]);
  111.         }
  112.     }
  113.     return 0;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement