Pagini recente » Cod sursa (job #391606) | Cod sursa (job #762295) | Cod sursa (job #2772898) | Cod sursa (job #2787997) | Cod sursa (job #2692736)
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
ifstream in ("disjoint.in");
ofstream out ("disjoint.out");
vector<int> parinte, size;
void make_set(int v)
{
parinte[v] = v; //se face o multime dintr-un nod => se face un arbore
size[v] = 1;
}
int find_set(int v)
{
if (v == parinte[v])//se cauta arborele parinte al nodului v
return v;
return parinte[v] = find_set(parinte[v]);
}
void union_sets(int a, int b)
{
a = find_set(a);
b = find_set(b);
if (a != b) //daca multimea din care face parte a e diferita de cea din care face parte b
{
//sunt multimi disjuncte si se unesc
if (size[a] < size[b])//doar daca marimea arborelui lui a e mai mica decat cea a lui b
swap(a, b);
parinte[b] = a;//se unesc arborii adica parintele lui b devine a
if(size[a] == size[b])
{
size[a] += 1;
}
//size[a] += size[b];//dimensiunea lui a creste
}
}
int main()
{
int N,M,x,y,z;
in>>N>>M;
parinte.assign(N,0);
size.assign(N,0);
for(int i = 1; i <= N; i++)
{
make_set(i);
}
for(int i = 1; i<=M; i++)
{
in>>x>>y>>z;
switch(x)
{
case 1: //reuniune
{
union_sets(y,z);
union_sets(find_set(y), find_set(z));
break;
}
case 2: //cautare
{
if(find_set(y) == find_set(z))
out <<"DA\n";
else
out<<"NU\n";
break;
}
}
}
return 0;
}