Pagini recente » Cod sursa (job #2622908) | Cod sursa (job #2181486) | Cod sursa (job #2166512) | Cod sursa (job #2705697) | Cod sursa (job #2932248)
#include <iostream>
#include <algorithm>
#include <fstream>
using namespace std;
ifstream in("disjoint.in");
ofstream out("disjoint.out");
///R - reprezentantul pt fiecare nod (reprezentantul componentei conexe din care face parte)
long long n, m, R[400005], op, nod1, nod2;
///functie recursiva care imi intoarce reprezentantul componentei conexe din care face parte un nod
long long reprez(long long x)
{
if(R[x] == x)
return x;
R[x] = reprez(R[x]);
return R[x];
}
///functie care imi reuneste doua componente conexe si imi seteaza un nou reprezentant comun pentru cele doua(una din valorile
///reprezentantilor actuali)
void reuniune(long long x, long long y)
{
R[reprez(x)] = reprez(y);
}
int main()
{
in>>n>>m;
///ii atribui reprezentantului fiecarui nod valoarea sa, deoarece am n noduri izolate
for(long long i = 1; i <= n; i++)
R[i] = i;
for(long long i = 1; i <= m; i++)
{
in>>op>>nod1>>nod2;
///daca operatia e de tip 1 si cele 2 noduri nu fac parte din aceeasi componenta conexa deja atunci le unesc
if(op == 1)
{
if(reprez(nod1) != reprez(nod2))
reuniune(nod1, nod2);
}
///daca operatia e de tip 2 afisez daca cele doua noduri fac parte din aceeasi componenta conexa(adica au acelasi reprezentant)
else
{
if(reprez(nod1) != reprez(nod2))
out<<"NU\n";
else
out<<"DA\n";
}
}
return 0;
}
///Complexitate memorie: O(n)
///Complexitate timp: O(mlogn)