Pagini recente » Cod sursa (job #2390244) | Cod sursa (job #3136250) | Cod sursa (job #1695603) | Cod sursa (job #2835671) | Cod sursa (job #2942875)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fcin("disjoint.in");
ofstream fcout("disjoint.out");
int n, m;
vector<int> tati, inaltime;
int caut_radacina(int src)
{
if(src!=tati[src])
return caut_radacina(tati[src]);
return src;
}
void reuninunea(int x, int y)
{
int tata_x = caut_radacina(x);
int tata_y = caut_radacina(y);
if(inaltime[tata_x]<inaltime[tata_x])
tati[tata_x] = tata_y;
else tati[tata_y] = tata_x;
if(inaltime[tata_x] == inaltime[tata_y])
inaltime[tata_x]++;
}
int main()
{
fcin>>n>>m;
tati.push_back(0);
inaltime.resize(n+1);
for(int i = 1; i<=n; ++i)
tati.push_back(i);
int x, y, cod;
for(int i=1; i<=m; ++i)
{
fcin>>cod>>x>>y;
switch (cod)
{
case 1:
// facem reuniunea a radacinei elementului x cu radacina elementului y
reuninunea(x, y);
break;
case 2:
// parcurgem arborele in sus si daca ajungem la aceeasi radacina
// atunci elementele noastre sunt in aceeasi multime
if(caut_radacina(x) == caut_radacina(y))
fcout<<"DA\n";
else fcout << "NU\n";
break;
}
}
fcin.close();
fcout.close();
return 0;
}