Pagini recente » Rating Robert Vintila (robertvintila) | Cod sursa (job #1335539) | Cod sursa (job #2224575) | Cod sursa (job #1500820) | Cod sursa (job #743992)
Cod sursa(job #743992)
#include<cstdio>
using namespace std;
const int Nmax = 100001;
int T[Nmax],Rang[Nmax]; // T[x] reprezinta tatal nodului x , Rang[x] reprezinta rangul nodului x
// rangul unui varf reprezinta distanta pana la cea mai departata frunza,adica numarul de muchii de la acel varf pana la cea mai departata frunza
void MakeSet(int x)
{
T[x]=x;
Rang[x]=1;
}
void Link(int x,int y)
{
if( Rang[x] > Rang[y] )
T[y] = x; // unesc multimea cu rang mai mic de multimea cu rang mai mare,adica tatal radacinii multimii mai mici va fi radacina multimii cu rang mai mare
else
if( Rang[x] < Rang[y] )
T[x] = y;
else
if(Rang[x] == Rang[y] )
{
T[x] = y;
Rang[y]++; // daca au acelasi rang,maresc rangul varfului care devine radacina noului arbore cu 1
}
}
int FindRoot(int x)
{
int i,a; // urc in arbore pana ajung la radacina,adica pana cand T[i]=i,adica tatal nodului i este nodul i
for(i=x;T[i]!=i;i=T[i]) // cand se termina for-ul,i o sa reprezinta radacina/reprezentantul arborelui/multimii/set-ului care-l contine pe x
;
/*while(T[x]!=x) // path compresion , compresia drumuriloe
{
a=T[x];
T[x]=i;
x=a;
}*/
return i; // returneaza radacina/reprezentantul arborelui/multimii/set-ului care-l contine pe x
}
void Union(int x,int y)
{
Link(FindRoot(x),FindRoot(y));
}
int main()
{
int n,m,i,operation,x,y;
FILE *in,*out;
in=fopen("disjoint.in","r");
out=fopen("disjoint.out","w");
fscanf(in,"%d %d",&n,&m);
for( i = 1 ; i <= n ; i++ )
MakeSet(i);
for( i = 1 ; i <= m ; i++ )
{
fscanf(in,"%d %d %d",&operation,&x,&y);
if( operation == 1 )
Union(x,y);
else
if( operation == 2 )
if( FindRoot(x) == FindRoot(y) )
fprintf(out,"DA\n");
else
fprintf(out,"NU\n");
}
fclose(in);
fclose(out);
}