Cod sursa(job #755739)

Utilizator XladhenianGrigorita Vlad-Stefan Xladhenian Data 6 iunie 2012 21:08:53
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
                                                     
#include <fstream>
using namespace std;

long Parinti[100005];
long Inaltime[100005];

long maxint(long a,long b)
{
 return (a > b)?a:b;
}

int main(void)
{
 long N,M,i,o,x,y,p1,p2;
 fstream fin("disjoint.in",ios::in);
 fstream fout("disjoint.out",ios::out);
 fin >> N >> M;
 for (i = 1;i <= N;i += 1)
  {
   Parinti[i] = i;
   Inaltime[i] = 1;
  }
 for (i = 0;i < M;i += 1)
  {
   fin >> o >> x >> y;
   if (o == 1)
     {
      p1 = Parinti[x];
      p2 = Parinti[y];
      while (Parinti[p1] != p1)
       {
        p1 = Parinti[p1];
       }
      while (Parinti[p2] != p2)
       {
        p2 = Parinti[p2];
       }
      if (Inaltime[p1] > Inaltime[p2])
        {
         Parinti[p2] = p1;
         Inaltime[p1] = maxint(Inaltime[p1],Inaltime[p2] + 1);
        }
       else
        {
         Parinti[p1] = p2;
         Inaltime[p2] = maxint(Inaltime[p2],Inaltime[p1] + 1);
        }
     }
   if (o == 2)
     {
      while (Parinti[x] != x)
       {
        x = Parinti[x];
       }
      while (Parinti[y] != y)
       {
        y = Parinti[y];
       }
      if (x == y)
        {
         fout << "DA\n";
        }
       else
        {
         fout << "NU\n";
        }
     }
  }
 fin.close();
 fout.close();
 return 0;
}