Pagini recente » Cod sursa (job #1639577) | Cod sursa (job #176236) | Cod sursa (job #483166) | Cod sursa (job #178561) | Cod sursa (job #2807383)
#include <bits/stdc++.h>
#define NMax 100001
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int N, M; // nr de multimi(noduri), nr de operatii efectuate
int parinte[NMax];
int Find(int x) // determina radacina arborelui din care face parte nodul x
{
if(parinte[x] == x) // inseamna ca x insusi este radacina
return x;
else
{
parinte[x] = Find(parinte[x]); // apeleaza recursiv pana ajunge la radacina
return parinte[x];
}
}
void Union(int x, int y) // se reunesc multimile celor doua numere x si y
{ // unim radacina lui x cu radacina lui y (adaugand rad lui y la rad lui x)
int a, b;
a = Find(x);
b = Find(y);
parinte[b] = a;
}
int main()
{
fin >> N >> M;
for(int i = 1; i <= N; ++i) // initial fiecare nod este propriul sau parinte
parinte[i] = i;
for(int i = 1; i <= M; ++i)
{
int op, x, y;
fin >> op >> x >> y;
if(op == 1) // se reunesc multimile nodurilor x si y, adica vor avea acelasi parinte
Union(x,y);
else
{
int a = Find(x); // daca nodurile x si y au aceeasi radacina atunci sunt din aceeasi multime
int b = Find(y);
if(a == b)
fout << "DA\n";
else
fout << "NU\n";
}
}
return 0;
}