Pagini recente » Cod sursa (job #2332535) | Cod sursa (job #151732) | Cod sursa (job #1684325) | Cod sursa (job #2187964) | Cod sursa (job #2861946)
#include <stdio.h>
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
const int NMAX = 100020;
int pointsTo[NMAX], rang[NMAX];
int n, m;
int findRoot(int x) {
int root = x;
while (pointsTo[root] != root) { // ajungem la radacina, care pointeaza catre ea insasi
root = pointsTo[root];
}
while (pointsTo[x] != x) { // (schimbam valoarea cu a radacinii ca sa fie totul la zi si sa nu avem raspunsuri eronate)
int aux = pointsTo[x];
pointsTo[x] = root;
x = aux;
}
/*
for (int i = 1; i <= n; ++i) {
cout << pointsTo[i] << " ";
}
cout << "\n";
*/
return root;
}
void unite(int x, int y) {
//unesc multimea cu rang mai mic de cea cu rang mai mare
if (rang[x] > rang[y]) {
pointsTo[y] = x;
} else {
pointsTo[x] = y;
}
//in caz ca rangurile erau egale atunci cresc rangul noii multimi cu 1
/*if (rang[x] == rang[y]) { //AICI MAI TRB SA INTELEG
++rang[y];
}
*/
}
int main() {
fin >> n >> m;
//initial fiecare nod pointeaza catre el insusi iar rangul fiecarui arbore este 1
for (int peak = 1; peak <= n; ++peak) {
pointsTo[peak] = peak;
rang[peak] = 1;
}
for (int i = 1; i <= m; ++i) {
int operation, x, y;
fin >> operation >> x >> y;
if (operation == 2) {
//verific daca radacina arborilor in care se afla x respectiv y este egala
if (findRoot(x) == findRoot(y)) {
fout << "DA";
} else {
fout << "NU";
}
fout << "\n";
} else { //unesc radacinile arborilor corespunzatori multimilor nodurilor x respectiv y
unite(findRoot(x), findRoot(y));
}
}
return 0;
}
/*
4 5
1 1 2
1 3 4
1 1 3
2 2 4
2 1 4
*/