Pagini recente » Cod sursa (job #421947) | Cod sursa (job #3286940) | Cod sursa (job #1170247) | Cod sursa (job #88090) | Cod sursa (job #2776814)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("disjoint.in");
ofstream fout ("disjoint.out");
int cod, x, y, t[100001], n, m, i;
int rad (int nod)
{
int start=nod;
while (t[nod]>0)
nod=t[nod];
if (start!=nod)
t[start]=nod;
return nod;
}
int main()
{
fin>>n>>m;
///ca sa verific daca 2 noduri fac parte din aceasi componenta conexa ma uit la arborii cu radacina fixata
/// si merg din nod la radacina, daca cele 2 noduri au aceeasi radacina sunt in aceasi comp conexa
///pun in t[radacina]=-inaltimea arborelui
///cand unesc 2 componente conexe compar inaltimile curente ale componentelor, daca sunt egale atunci
/// inaltimea noului arbore creste cu 1, altfel ramane constanta; unesc radacina arborelui mai mic
/// de radacina arborelui mai mare
/// compresia drumului: dupa ce parcurg un drum de la nodul curent la radacina pun direct radacina ca tatal nodului
for (i=1; i<=m; i++)
{
fin>>cod>>x>>y;
if (cod==2)
{
int rx=rad(x);
int ry=rad(y);
if (rx==ry)
fout<<"DA\n";
else
fout<<"NU\n";
}
else
{
int rx=rad(x);
int ry=rad(y);
if (rx!=ry)
{
if (t[rx]==t[ry])
{
t[ry]=rx;
t[rx]--;
}
if (-t[rx]>-t[ry])
{
t[ry]=rx;
}
if (-t[rx]<-t[ry])
{
t[rx]=ry;
}
}
}
}
}