Pagini recente » Cod sursa (job #2587841) | Cod sursa (job #734516) | Cod sursa (job #1299766) | Cod sursa (job #2901614) | Cod sursa (job #2906589)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
const int maxN = 100005;
int n, m, parent[maxN], depth[maxN];
int absolute_parent(int x) // functia care intoarce valoarea parintelui absolut (radacinii)
{
if(parent[x] == x)
return x;
return parent[x] = absolute_parent(parent[x]); // o apelam recursiv pana la radacina
}
void unite(int x, int y) // functia care uneste cele 2 multimi
{
if(depth[x] < depth[y])
parent[x] = y;
else if(depth[x] > depth[y])
parent[y] = x;
else
parent[y] = x, depth[x]++;
}
int main()
{
fin >> n >> m;
for(int i = 1; i <= n; i++)
parent[i] = i; // fiecare nod este initial parintele propriu
for(int code, x, y, i = 1; i <= m; i++)
{
fin >> code >> x >> y; // citim pe rand din fisier codul operatiei si cele doua numere
if(code == 1)
{
x = absolute_parent(x), y = absolute_parent(y);
unite(x, y); // daca codul este 1, unim cele 2 multimi
}
if(code == 2)
{
x = absolute_parent(x), y = absolute_parent(y);
if(x == y) // daca au acelasi parinte absolut (aceeasi radacina) inseamna ca sunt in aceeasi multime
fout << "DA\n";
else
fout << "NU\n";
}
}
return 0;
}