Pagini recente » Cod sursa (job #1177577) | Cod sursa (job #3036488) | Cod sursa (job #2925323) | Cod sursa (job #2872460) | Cod sursa (job #3292102)
#include <fstream>
using namespace std;
ifstream f("disjoint.in"); ofstream g("disjoint.out");
int n,m,T[100020],R[100020];
int find(int x)
{ int rad=x;
///merg in sus pe arbore pana gasesc un nod care pointeaza catre el insusi
while(T[rad]!=rad) rad=T[rad];
///aplic compresia drumurilor
while(T[x]!=x) {int y=T[x]; T[x]=rad; x=y;}
return rad;
}
void unite(int x, int y)
{ ///unesc multimea cu rang mai mic de cea cu rang mai mare
if(R[x]>R[y]) T[y]=x; else T[x]=y;
///in caz ca rangurile erau egale atunci cresc rangul noii multimi cu 1
if (R[x]==R[y]) R[y]++;
}
/**
int find(int x)
{ if(z==T[x]) return x;
T[x]=find(T[x]);
return T[x];
}
void unite(int x, int y)
{ if(R[x]>R[y]) T[y]=x; else T[x]=y;
if (R[x]==R[y]) R[y]++;
}
*/
int main()
{ f>>n>>m;
///initial fiecare nod pointeaza catre el insusi iar rangul fiecarui arbore este 1
for(int i=1;i<=n;i++) {T[i]=i; R[i]=1;}
for(int cd,x,y;m;m--)
{ f>>cd>>x>>y;
if(cd==2)
///verific daca radacina arborilor in care se afla x respectiv y este egala
if(find(x)==find(y)) g<<"DA\n"; else g<<"NU\n";
else
///unesc radacinile arborilor corespunzatori multimilor nodurilor x respectiv y
unite(find(x),find(y));
}
g.close(); f.close(); return 0;
}