Pagini recente » Cod sursa (job #2147517) | Cod sursa (job #2430599) | Cod sursa (job #847184) | Cod sursa (job #214577) | Cod sursa (job #2948671)
//Complexitatea este O(log*n)
//IDEE
//- reprezentam fiecare multime ca pe un arbore cu radacina
//Pentru operatie de tip 2
// -parcurgem arborele in sus din ambele elemente
// si daca la sfarsit ajungem in aceeasi radacina atunci elementele noastre se afla in aceeasi multime
//Pentru operatie de tip 1
// -determinam radacinile celor 2 arbori si le conectam printr-o muchie.
#include <fstream>
#include <vector>
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
vector <int>tata;
//merg in sus pe arbore pana gasesc radacina
int Rad(int x){
if(tata[x] == 0)
return x;
return tata[x] = Rad(tata[x]);
}
int main(){
int n, m, cod, x, y;
f >> n >> m;
tata.resize(n+1, 0);
for(int i = 0; i < m; i++){
f >> cod >> x >> y;
if(cod == 1){
//unesc radacinile arborilor corespunzatori multimilor nodurilor x respectiv y
int radacinaX = Rad(x);
int radacinaY = Rad(y);
tata[radacinaX] = radacinaY;
}
else
//verific daca radacina arborilor in care se afla x respectiv y este egala
if(Rad(x) == Rad(y))
g<<"DA\n";
else
g<<"NU\n";
}
return 0;
}