Pagini recente » Cod sursa (job #2810775) | Cod sursa (job #2683184) | Cod sursa (job #388287) | Cod sursa (job #2366100) | Cod sursa (job #2948003)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
vector<int> parinte;
vector<int> grad;
//funtie pentru gasirea radacinii
int find_father(int x)
{
if(parinte[x]==x)
return x;
return find_father(parinte[x]);
}
int main()
{
int n,m,op,x,y;
f>>n>>m;
parinte.resize(n+1);
grad.resize(n+1);
for(int i=1; i<=n;i++)
{
parinte[i]=i;
grad[i]+=1;
}
for(int i=1;i<=m;i++)
{
f>>op>>x>>y;
if(op==1)
{
//unim cei 2 arbori. Arborele cu grad mai mic va fi alipit la cel cu grad mai mare.
if(grad[find_father(x)]<grad[find_father(y)])
{
grad[find_father(y)]+=grad[find_father(x)];
//modificam radacina arborelui mai mic, care o va prelua pe cea a arborelui mare
parinte[find_father(x)]=find_father(y);
}
else
{
grad[find_father(x)]+=grad[find_father(y)];
parinte[find_father(y)]=find_father(x);
}
}
if(op==2)
{
//verificam daca ambii arbori au aceeasi radacina
if(find_father(x)==find_father(y))
g<<"DA\n";
else
g<<"NU\n";
}
}
return 0;
}