Pagini recente » Cod sursa (job #320386) | Cod sursa (job #805) | Cod sursa (job #2792984) | Cod sursa (job #2220813) | Cod sursa (job #2944416)
#include <fstream>
#include <vector>
#define N 100005
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int tata[N], rang[N];
int n, m;
int CautareRad(int nod)
{
int rad = nod;
while(tata[rad] != rad)
rad = tata[rad];
tata[nod] = rad;
return rad;
}
void Reunire(int nod1, int nod2)
{
int radacina1, radacina2;
radacina1 = CautareRad(nod1);
radacina2 = CautareRad(nod2);
/// la arborele cu radacina mai mica "aducem celalalt arbore"
if(radacina1 == radacina2)
return;
if(rang[radacina1] < rang[radacina2])
{
tata[radacina1] = radacina2;
rang[radacina2] = rang[radacina2] + rang[radacina1];
}
else
{
tata[radacina2] = radacina1;
rang[radacina1] = rang[radacina1] + rang[radacina2];
}
}
void Afisare(int nod1, int nod2)
{
/// daca arborii in care se afla cele 2 noduri au radacina egala
if(CautareRad(nod1) == CautareRad(nod2))
fout <<"DA";
else
fout <<"NU";
fout <<"\n";
}
void Citire()
{
fin >> n >> m;
for(int i=1; i <=n; i++)
{
/// fiecare nod are ca tata pe el insusi
tata[i] = i;
rang[i] = 1;
}
for(int i = 1; i <= m; i++)
{
int tip, x, y;
fin >> tip >> x >> y;
if(tip == 1)
Reunire(x,y);
if(tip == 2)/// daca radacina arborelui unde se afla x = radacina arborelui unde se afla y
Afisare(x,y);
}
}
int main()
{
Citire();
return 0;
}