Cod sursa(job #1457701)

Utilizator petru.cehanCehan Petru petru.cehan Data 4 iulie 2015 10:22:24
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
// Complexitate O ( log *N) .. unde log STAR de N este inversa functiei lui Ackerman
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin ("disjoint.in") ;
ofstream fout ("disjoint.out") ;

int N , M ,P [100005] , R [100005];
// P - vector parinte
// R - vector de rang

int Find ( int x )
{
    int root , aux ;

    //merg in arbore in sus pana gasesc P [root] = root ;
    for ( root = x ; P [root] != root ; root = P [root] ) ;

    // compresie drumuri .. leg toate nodurile de radacina ;
    while ( P[x] != x )
    {
        aux = P[x];
        P[x] = root;
        x = aux;
    }

    return root;
}

void Union ( int x , int y )
{
    // unesc multimea cu rang (inaltimea arborelui) mai mic de cea cu rang mai mare
    if ( R [x] > R [y] )
        P [y] = x;
      else
        P [x] = y;
    // ranguri egale => cresc rangul noii multimi cu 1 ;
    if ( R[x] == R[y])
        ++ R[y] ;
}

int main()
{
 fin >> N >> M ;
 int i ;
 // initializare
 for ( i = 1 ; i <= N ; ++ i )
      {
          P[i] = i;
          R[i] = 1;
      }

    int op , x , y , A , B ;

      for ( i = 1 ; i <= M ; ++ i )
      {
          fin >> op >> x >> y ;

          A = Find (x) , B = Find (y) ;

          if ( op == 1 )
          {
              if ( A != B )          // radacina arborelui in care se afla x este aceasi cu cea a arborelui in care se afla y ?
                      Union ( A , B ) ;  // unesc arborii .. leg radacina celui cu rang mai mic de radacina celuilalt
          }
        else
          {
              if ( A == B )
                      fout << "DA \n" ;
              else
                      fout << "NU \n" ;
          }
      }
    return 0;
}