Pagini recente » Cod sursa (job #1464261) | Cod sursa (job #1620196) | Cod sursa (job #2194631) | Cod sursa (job #3174005) | Cod sursa (job #1512626)
using namespace std;
#include <fstream>
#define Nmax 100020
FILE *f=fopen ("disjoint.in", "r");
FILE *g=fopen ("disjoint.out", "w");
int TT[Nmax];//vectorul cu stramosi
int RG[Nmax];//rangul arborelui
int N,M;
int rad(int x)
{
int R,y;
//aflam radacina arborelui care il contine pe x
for(R=x;TT[R]!=R; R=TT[R]);
//toti stramosii lui x vor avea aceeasi radacina
//deci in vectorul TT in care retinem primul stramos al lui x
//vom retine radacina
while(TT[x]!=x)
{
y=TT[x]; //
TT[x]=R;
x=y;
}
return R;
}
void unite(int x,int y)
{
//unim multimea de rang mai mic de cea cu rang mai mare
if(RG[x]>RG[y])
TT[y]=x;
else TT[x]=y;
if(RG[x]==RG[y]) RG[y]++;
}
int main()
{
fscanf(f,"%d%d", &N,&M);
int i,x,y,cd;
//la inceput fiecare arbore are radacina i si rangul 1
for(i=1; i<=N; i++)
{
TT[i]=i;
RG[i]=1;
}
for(i=1; i<=M; i++)
{
fscanf(f,"%d%d%d",&cd,&x,&y);
if(cd==2)
{
if(rad(x)==rad(y))fprintf(g,"DA\n");
else fprintf(g,"NU\n");
}
else
{
unite(rad(x),rad(y));
}
}
return 0;
}