Cod sursa(job #949405)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 13 mai 2013 17:58:20
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
//Ultimele 5 surse trimise (cu tot cu aceasta)
//0. Ambele euristici 100p
//1. Compresie drumuri 100p
//2. Fara euristici 70p
//3. Reuniune dupa rang 100p
//4. Ambele euristici 100p

#include <fstream>

using namespace std;

int tata[100002];
int h[100002];

int find(int x)
{
   int r=x;
   while(tata[r])
     r=tata[r];
   int y,t;
   y=x;
   
   while(y!=r)
   {
      t=tata[y];
      tata[y]=r;
      y=t;           
   } 
      
   return r;    
}

void uneste(int x,int y)
{
   x=find(x);
   y=find(y);
   
   if(h[x]<h[y])
     tata[x]=y;
   else
   {
     tata[y]=x;
     if(h[x]==h[y])
       h[x]++;    
   }
}

int main()
{
    ifstream fin("disjoint.in");
    ofstream fout("disjoint.out");
    int n,i,m,tip,x,y;
    fin>>n>>m;
    
    for(i=1;i<=n;i++)
      h[i]=1;
    
    for(i=0;i<m;i++)
    {
       fin>>tip>>x>>y;
       if(tip==1)
         uneste(x,y);
       else
       {
          if(find(x)==find(y))
             fout<<"DA\n";    
          else
             fout<<"NU\n";
       }
    }
    
    fin.close();
    fout.close();    
    //system("PAUSE");
    
    return 0;
}