Pagini recente » Autentificare | Cod sursa (job #2370713) | Cod sursa (job #2425575) | Cod sursa (job #2599051) | Cod sursa (job #2945886)
/// complexitate: M*logN
#include <iostream>
#include <fstream>
#include <vector>
#include <cstdlib>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
vector <int> radacini; ///vector de tati
int Find(int x) ///obtinem radacina arborelui din care face parte nodul x
{
if(x == radacini[x]) return x;
else return Find(radacini[x]);
}
/*int find_height(int x)
{
if(x == radacini[x]) return 0;
else return 1 + find_height(radacini[x]);
}
*/
void Union(int x, int y) ///unim doi arbori (construim astfel incat arborii mai inalti sa fie intotdeauna cei cu radacina mai mica)
{
int xroot = Find(x);
int yroot = Find(y);
if(xroot > yroot)
{
radacini[yroot] = xroot;
}
else radacini[xroot] = yroot;
}
int main() {
int N, M;
fin >> N >> M;
radacini.resize(N+1);
for(int i=1; i<=N; i++) ///setam radacina arborelui fiecarui nod cu el insusi
radacini[i] = i;
for(int i=1; i<=M; i++)
{
int x, y, op;
fin >> op >> x >> y;
if(op == 2)
{
if(Find(x) == Find(y))
fout << "DA\n";
else fout << "NU\n";
}
else if(op == 1)
{
if(Find(x) != Find(y))Union(x, y);
}
}
return 0;
}