Cod sursa(job #2077414)

Utilizator Andrei243Nitu Mandel Andrei Andrei243 Data 28 noiembrie 2017 00:04:56
Problema Paduri de multimi disjuncte Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <iostream>
#include <fstream>
using namespace std;
int tati[100000];
int rang[100000];
ifstream in("disjoint.in");
ofstream out("disjoint.out");



int tata_suprem(int a){
int sup,aux;
sup=a;
while(sup!=tati[sup]){sup=tati[sup];}
int i;
for(i=a;i!=tati[i];i=tati[i]){
aux=tati[i];
tati[i]=sup;
i=aux;

}
return sup;
}
void aceeasi(int a,int b){
if(tata_suprem(a)==tata_suprem(b))out<<"DA"<<'\n';
else out<<"NU"<<'\n';


}

void uneste_cu_tatii(int a,int b){
tati[b]=a;

}

void legatura_directa(int a){
int i=tata_suprem(a);
int j;
while(a!=i){
j=a;
a=tati[a];
tati[j]=i;
}

}


void unite(int a,int b){
int i,j;
i=a;j=b;


if(rang[a]>rang[b])uneste_cu_tatii(a,b);

else uneste_cu_tatii(b,a);
if(rang[a]==rang[b]) {
rang[a]++;


}
}


int main()
{int n,nrop;
  in>>n>>nrop;
int op,arg1,arg2;
  for(int i=1;i<=n;i++){
  tati[i]=i;
  rang[i]=1;
  }

  for(int i=1;i<=nrop;i++){
  in>>op>>arg1>>arg2;

  if(op==1)unite(arg1,arg2);
  else aceeasi(arg1,arg2);


  }


    return 0;
}