Pagini recente » Cod sursa (job #2182131) | Cod sursa (job #760039) | Cod sursa (job #1063254) | Cod sursa (job #720709) | Cod sursa (job #2674825)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int n,m;
int card[100005];///numarul de elemente ale arborelui cu radacina i
int parent[100005];///radacina arborelui din care face parte nodul i
int find_parent(int pos)
{
///Se cauta radacina arborelui din care face parte nodul pos
if (parent[pos]!=pos)
{
parent[pos]=find_parent(parent[pos]);
return parent[pos];
}
return pos;
}
void reuniune(int x,int y)
{
///Reunim cele 2 multimi din care fac parte x si y
///Gasim radacinile arborilor din care fac parte nodurile x si y
x=find_parent(x);
y=find_parent(y);
///Arborele cu mai putine elemente se leaga de cel cu mai multe elemente
if (card[x]<card[y])
swap(x,y);
parent[y]=x;
card[x]+=card[y];
}
bool check_same_set(int x,int y)
{
///Verificam daca elementele x si y fac parte din aceeasi multime
///Gasim radacinile arborilor din care fac parte elementele x si y
x=find_parent(x);
y=find_parent(y);
return x==y;///Multimiile din care fac parte elementele trebuie sa aiba aceeasi radacina
}
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
{
///Se initializeaza numarul de elemente si radacina arborelui i
parent[i]=i;
card[i]=1;
}
int type,x,y;
for(int i=1;i<=m;i++)
{
fin>>type>>x>>y;
if (type==1)
reuniune(x,y);
else
{
if (check_same_set(x,y))
fout<<"DA";
else
fout<<"NU";
fout<<"\n";
}
}
return 0;
}