Cod sursa(job #2077401)

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


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

}
int tata_suprem(int a){

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


}




void unite(int a,int b){
int i,j;
i=a;j=b;
while(tati[i]!=i)i=tati[i];
while(tati[j]!=j)j=tati[j];

if(rang[i]>rang[j])uneste_cu_tatii(i,b);

else if(rang[j]>rang[i])uneste_cu_tatii(j,a);
else {
rang[i]++;
uneste_cu_tatii(i,b);

}
}


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;
}