Cod sursa(job #1044150)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 29 noiembrie 2013 12:57:54
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 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)
{
   if(tata[x]!=0)
      tata[x]=find(tata[x]);

   if(tata[x]!=0)
      return tata[x];
   return 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=0,m=0,i,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();
    return 0;
}