Pagini recente » Cod sursa (job #2798396) | Cod sursa (job #162777) | Cod sursa (job #2959680) | Cod sursa (job #2709904) | Cod sursa (job #3003385)
// Paduri de multimi disjuncte - 100p
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
#define MAX 100001
vector<int> parent(MAX + 1);
vector<int> rang(MAX + 1);
void make_set(int v)
{
rang[v] = 0;
parent[v] = v;
}
int find_set(int v)
{
if (parent[v] == v)
return v;
return parent[v] = find_set(parent[v]);
}
void union_set(int a, int b)
{
a = find_set(a);
b = find_set(b);
if (rang[a] < rang[b])
swap(a, b);
parent[b] = a;
if (rang[a] == rang[b])
rang[a]++;
}
int main()
{
int n, m;
f >> n >> m;
int t, a, b;
for (int i = 1; i <= n; i++)
make_set(i);
for (int q = 1; q <= m; q++)
{
f >> t >> a >> b;
if (t == 1) // Reuniunea multimii care il contine pe a cu cea care il contine pe b
union_set(a, b);
else
if (find_set(a) == find_set(b)) // Se afla a si b in aceeasi multime?
g << "DA" << '\n';
else
g << "NU" << '\n';
}
f.close();
g.close();
return 0;
}