Pagini recente » Cod sursa (job #2545895) | Cod sursa (job #1421283) | Cod sursa (job #623060) | Cod sursa (job #2251379) | Cod sursa (job #1336402)
#include <fstream>
#define NMAX 100004
using namespace std;
FILE*fin=fopen("disjoint.in", "r");
FILE*fout=fopen("disjoint.out", "w");
int n, m;
int tata[NMAX];
int h[NMAX];//h[i]=inaltimea arborelui cu radacina i
void citire();
void initializare();
int gasesc(int x);
int Find(int x);
void Union(int i, int j);
int main()
{
citire();
return 0;
}
void citire()
{
int i, cod, x, y, cx, cy, nr1, nr2;
fscanf(fin, "%d %d", &n, &m);
initializare();
for(i=1;i<=m;i++)
{
fscanf(fin, "%d %d %d", &cod, &x, &y);
cx=Find(x);
cy=Find(y);
if(cod==1)
Union(cx, cy);
else
{
if(cx==cy) fprintf(fout, "DA\n");//fout<<"1\n";
else fprintf(fout, "NU\n");//fout<<"0\n";
}
}
}
void initializare()
{
int i;
for(i=1;i<=n;i++)
h[i]=1;
}
int Find(int x)
{
//caut radacina
int rad=x, aux;
while(tata[rad]) rad=tata[rad];
while(tata[x]) {aux=tata[x]; tata[x]=rad; x=aux;}
return rad;
}
void Union(int i, int j)
{
//i, j=radacinile arborilor care reprezinta cele 2 submultimi
if(h[i]<h[j])//i devine fiu al lui j
tata[i]=j;
else
{
tata[j]=i;
if(h[i]==h[j])
h[i]++;
}
}