Pagini recente » Cod sursa (job #1456642) | Cod sursa (job #3189457) | Cod sursa (job #2611408) | Cod sursa (job #730473) | Cod sursa (job #1457701)
// 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;
}