Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Task : Disjoint Set Union [DSU]
- Author : Phumipat C. [MAGCARI]
- Language : C++
- */
- #include<bits/stdc++.h>
- using namespace std;
- int p[100010],sol[100010];
- int findroot(int now){
- if(p[now] == now)
- return now;
- else
- return p[now] = findroot(p[now]);
- }
- int main(){
- int n,m,u,v,ru,rv;
- scanf("%d %d",&n,&m);
- for(int i=1;i<=n;i++){
- scanf("%d",&sol[i]);
- p[i] = i;
- }
- while(m--){
- scanf("%d %d",&u,&v);
- ru = findroot(u);
- rv = findroot(v);
- if(ru == rv){
- printf("-1\n");
- }else{
- if(sol[ru]>sol[rv] || (sol[ru] == sol[rv] && ru<rv)){
- printf("%d\n",ru);
- sol[ru]+=sol[rv]/2;
- p[rv] = ru;
- }else if(sol[rv]>sol[ru] || (sol[ru] == sol[rv] && rv<ru)){
- printf("%d\n",rv);
- sol[rv]+=sol[ru]/2;
- p[ru] = rv;
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment