Pagini recente » Cod sursa (job #1429568) | Cod sursa (job #2488310) | Cod sursa (job #1342849) | Cod sursa (job #1565161) | Cod sursa (job #2938944)
#include <iostream>
#include <fstream>
#include <vector>
//facem un vector de tati pt fiecare nod, tatal unui nod fiind "seful" multimii din care face parte nodul respectiv. pt operatia 1 daca nu sunt in aceeasi multime (adica au tati diferiti) ii
//schimbam tatal unuia dintre ei. pt op2 verificam daca au sau nu acelasi tata
using namespace std;
ifstream in("disjoint.in");
ofstream out("disjoint.out");
int multimi, operatii;
vector<int> dad, sizee;
int root(int nod)
{
if(nod == dad[nod])
return nod;
int newDad = root(dad[nod]);
dad[nod] = newDad;
return newDad;
}
void op1(int nod1, int nod2)
{
int dad1 = root(nod1);
int dad2 = root(nod2);
if(dad1 != dad2) //daca sunt egala inseamna ca sunt deja in aceeasi multime si nu se intampla nimic
{
if(sizee[nod1] < sizee[nod2])
{
dad[nod1] = dad2;
sizee[nod2] += sizee[nod1];
}
else
{
dad[nod2] = dad1;
sizee[nod1] += sizee[nod2];
}
}
}
int main()
{
int op, nod1, nod2, i;
in >> multimi >> operatii;
dad.resize(multimi + 1);
sizee.resize(multimi + 1, 1);
for(i = 1; i <= multimi; i++)
dad[i] = i;
for(i = 1; i <= operatii; i++)
{
in >> op >> nod1 >> nod2;
if(op == 1)
op1(nod1, nod2);
else
{
if(root(nod1) == root(nod2))
out << "DA" << '\n';
else
out << "NU" << '\n';
}
}
}