Pagini recente » Cod sursa (job #3284546) | Cod sursa (job #2764130) | Cod sursa (job #3348) | Cod sursa (job #1153124) | Cod sursa (job #1838705)
#include <fstream>
using namespace std;
#define NMAX 100002
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int Tata[NMAX], Grad[NMAX];
int GetRoot(int x) {
int root;
// gasim radacina
for (root = x; root != Tata[root]; root = Tata[root]);
// aplicam compresia drumurilor
int aux;
while (x != Tata[x]) {
aux = Tata[x];
Tata[x] = root;
x = aux;
}
return root;
}
// unim doi arbori (multimi)
void Unite (int x, int y) {
x = GetRoot(x);
y = GetRoot(y);
if (Grad[x] > Grad[y])
Tata[y] = x;
else
Tata[x] = y;
if (Grad[x] == Grad[y])
Grad[y]++;
}
int main() {
int N, M;
fin >> N >> M;
//actualizez vectorul de tati si ponderile multimilor
for (int i = 1; i <= N; ++i) {
Tata[i] = i;
Grad[i] = 1;
}
// rezolvare
int x, a, b;
while (M--) {
fin >> x >> a >> b;
if (x == 1)
Unite(a, b);
else
fout << (GetRoot(a) == GetRoot(b) ? "DA" : "NU") << "\n";
}
return 0;
}