Pagini recente » Cod sursa (job #1033760) | Cod sursa (job #13030) | Cod sursa (job #1567048) | Cod sursa (job #1737119) | Cod sursa (job #2193054)
#include <fstream>
#define MAX 100005
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int Arbore[MAX], Rank[MAX];
int findR(int val){
int r = val, y;
while(Arbore[r] != r) /// parcurg arborele pana gasesc un nod care pointeaza catre el insusi
r = Arbore[r];
while(Arbore[val] != val){ ///aplic compresia drumurilor
y = Arbore[val];
Arbore[val] = r;
val = y;
}
return r;
}
void Union(int Rx, int Ry){
if(Rank[Rx] > Rank[Ry])
Arbore[Rx] = Ry;
else Arbore[Ry] = Rx;
if(Rank[Rx] == Rank[Ry]) ///daca sunt egale, crestem Rank-ul
Rank[Ry]++;
}
int main()
{
int n, m;
fin >> n >> m;
for(int i = 1; i <= n; ++i) /// la inceput fiecare pointeaza catre el si au lungime 1
{
Arbore[i] = i;
Rank[i] = 1;
}
for(int i = 1; i <= m; ++i){
int c, x, y;
fin >> c >> x >> y;
if(c == 1){
Union(findR(x), findR(y)); ///unesc radacinile arborilor
}
else {
if(findR(x) == findR(y)) ///verific daca au aceeasi radacina
fout << "DA\n";
else fout << "NU\n";
}
}
return 0;
}