MAGCARI

DSU

Jul 20th, 2022
882
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.75 KB | None | 0 0
  1. /*
  2.     Task        : Disjoint Set Union [DSU]
  3.     Author      : Phumipat C. [MAGCARI]
  4.     Language    : C++
  5. */
  6. #include<bits/stdc++.h>
  7. using namespace std;
  8. int p[100010],sol[100010];
  9. int findroot(int now){
  10.     if(p[now] == now)
  11.         return now;
  12.     else
  13.         return p[now] = findroot(p[now]);
  14. }
  15. int main(){
  16.     int n,m,u,v,ru,rv;
  17.     scanf("%d %d",&n,&m);
  18.     for(int i=1;i<=n;i++){
  19.         scanf("%d",&sol[i]);
  20.         p[i] = i;
  21.     }
  22.     while(m--){
  23.         scanf("%d %d",&u,&v);
  24.        
  25.         ru = findroot(u);
  26.         rv = findroot(v);
  27.  
  28.         if(ru == rv){
  29.             printf("-1\n");
  30.         }else{
  31.             if(sol[ru]>sol[rv] || (sol[ru] == sol[rv] && ru<rv)){
  32.                 printf("%d\n",ru);
  33.                 sol[ru]+=sol[rv]/2;
  34.                 p[rv] = ru;
  35.             }else if(sol[rv]>sol[ru] || (sol[ru] == sol[rv] && rv<ru)){
  36.                 printf("%d\n",rv);
  37.                 sol[rv]+=sol[ru]/2;
  38.                 p[ru] = rv;
  39.             }
  40.         }
  41.     }
  42.     return 0;
  43. }
Advertisement
Add Comment
Please, Sign In to add comment