Pagini recente » Cod sursa (job #781693) | Autentificare | Cod sursa (job #1983843) | Cod sursa (job #507913) | Cod sursa (job #1607843)
#include <fstream>
using namespace std ;
ifstream f ("disjoint.in") ;
ofstream g ("disjoint.out") ;
int arbore[100002], rang[100002] ;
int n , m ;
int cauta ( int x )
{
//merg in sus pe arbore pana gasesc un nod care pointeaza catre el insusi ( radacina )
int R = x ;
while ( arbore[R] != R )
R = arbore[R] ;
//aplic compresia drumurilor ( unim nodurile la radacina , dar nu schimbam rangul )
while ( arbore[x] != x )
{
int y = arbore[x] ;
arbore[x] = R ;
x = y ;
}
return R ; //returnam radacina
}
void uneste ( int x , int y )
{
//unesc multimea cu rang mai mic de cea cu rang mai mare
if ( rang[x] > rang[y] )
arbore[y] = x ;
else
arbore[x] = y ;
//in caz ca rangurile erau egale atunci cresc rangul noii multimi cu 1
if ( rang[x] == rang[y] )
++rang[y] ;
}
int main()
{
f >> n >> m ;
int i, x, y, cd;
//initial fiecare nod pointeaza catre el insusi iar rangul fiecarui arbore este 1
for ( int i = 1 ; i <= n ; ++i )
arbore[i] = i , rang[i] = 1 ;
for ( int i = 1 ; i <= m ; ++i )
{
int x , y , cod ;
f >> cod >> x >> y ;
if ( cod == 2 )
{
//verific daca radacina arborilor in care se afla x respectiv y este egala
if ( cauta ( x ) == cauta ( y ) )
g << "DA\n" ;
else
g << "NU\n" ;
}
else //unesc radacinile arborilor corespunzatori multimilor nodurilor x respectiv y
uneste ( cauta ( x ) , cauta ( y ) ) ;
}
return 0 ;
}