Cod sursa(job #749741)

Utilizator blue_phoenixPosea Elena blue_phoenix Data 18 mai 2012 15:44:19
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
using namespace std;
#define nmax 100010

int RANK[nmax],TATA[nmax];

int radacina(int nod){//cand caut radacina, fac si compresia drumurilor
   //nu modific rank-ul pt niciun nod
   int rad,aux;
   for(rad=nod;rad!=TATA[rad];rad=TATA[rad]);
   //acum rad este radacina arborelui
   //mai parcurg odata ca sa fac compresia
   for(;nod!=TATA[nod];){aux=TATA[nod];TATA[nod]=rad;nod=aux;}
   return rad;
}


void reuniune(int a, int b){
   if(RANK[a]>RANK[b]){//il lipesc pe cel mic de cel mare
      TATA[b]=a; 
   }else TATA[a]=b;
   if(RANK[a]==RANK[b])RANK[b]++;
}


int main(){
  ifstream fin("disjoint.in");
  ofstream fout("disjoint.out");
  int n,m;
  int cod,a,b;
  fin>>n>>m;
  int i;
  for(i=1;i<=n;i++){
      TATA[i]=i;
      RANK[i]=1;
   }
   for(i=0;i<m;i++){
     fin>>cod>>a>>b;
     switch(cod){
       case 1://reuniune
         reuniune(radacina(a),radacina(b));
         break;
       case 2://intrebare
         if(radacina(a)==radacina(b)){
            fout<<"DA"<<"\n";
         }else fout<<"NU"<<"\n";
         break;
     }
   }
return 0;
}