Pagini recente » Cod sursa (job #693654) | Cod sursa (job #1413268) | Cod sursa (job #527326) | Cod sursa (job #2619481) | Cod sursa (job #2181386)
#include <iostream>
#include <fstream>
#define MAX 100001
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int n, m, rang[MAX], traseu[MAX];
void init()
{
for (int i = 1; i <= n; ++i)
rang[i] = traseu[i] = i;
}
//returneaza radacina arborelui de care apartine x
int Find(int x){
if (x == traseu[x])
return x;
traseu[x] = Find(traseu[x]);
return traseu[x];
}
//uneste cei 2 arbori de care apartin x si y
void unite(int x, int y){
x = Find(x);
y = Find(y);
if (rang[x] > rang[y])
swap(x, y);
//x are valoarea randului mai mic, deci y al rangului mai mare
traseu[x] = y;
rang[y] += rang[x];
}
int main()
{
int x, y, cod;
fin >> n >> m;
init();
for (int i = 0; i < m; ++i) {
fin >> cod >> x >> y;
if (cod == 1) {
unite(Find(x), Find(y));
}
else {
if (Find(x) == Find(y))
fout << "DA\n";
else
fout << "NU\n";
}
}
fout.close();
return 0;
}