Pagini recente » Cod sursa (job #2388754) | Cod sursa (job #2971257) | Cod sursa (job #410430) | Cod sursa (job #203807) | Cod sursa (job #2939170)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("disjoint.in");
ofstream out("disjoint.out");
vector <int> tata, dimArbore;
int n, m;
int aflaTata(int nod) //fct. care calculeaza rad. arborelui in care se afla nodul
{
if(nod == tata[nod])
return nod;
return tata[nod] = aflaTata(tata[nod]);
}
int main()
{
int cod, x, y;
in>>n>>m;
tata.resize(n+1);
dimArbore.resize(n+1);
for(int i=1; i<=n; i++)
{
////in fiecare arbore se afla un singur nod, rad., deci tatal rad. e rad. si dim arborelui e 1
tata[i] = i;
dimArbore[i] = 1;
}
for(int i=1; i<=m; i++)
{
in>>cod>>x>>y;
x = aflaTata(x); //aflu radacina arborelui in care se afla x
y = aflaTata(y); //aflu radacina arborelui in care se afla y
if(cod == 1)
{
if(x != y) //daca nu se afla deja in acc. arbore
{
//lipesc arborele mai mic de cel mai mare
if(dimArbore[x] < dimArbore[y])
{
tata[y] = x;
dimArbore[x] += dimArbore[y];
}
else
{
tata[x] = y;
dimArbore[y] += dimArbore[x];
}
}
}
else if(cod == 2)
{
if(x == y) //daca arborii din care fac parte au acc. rad., sunt acc. arbore
out<<"DA\n";
else
out<<"NU\n";
}
}
return 0;
}