Pagini recente » Cod sursa (job #1983395) | Cod sursa (job #2894166) | Cod sursa (job #184760) | Cod sursa (job #1791108) | Cod sursa (job #1875269)
#include <fstream>
#define NMAX 100020
using namespace std;
ifstream f("disjoint.in"); ofstream g("disjoint.out");
int N,M,TT[NMAX],RG[NMAX];
int find(int x)
{ int R,y;
for(R=x; TT[R]!=R; R=TT[R]);//merg in sus pe arbore pana gasesc un nod care pointeaza catre el insusi
for(;TT[x]!=x;) //aplic compresia drumurilor
{y=TT[x]; TT[x]=R; x=y;}
return R;
}
void unite(int x, int y)
{ if(RG[x]>RG[y]) TT[y]=x; else TT[x]=y; //unesc multimea cu rang mai mic de cea cu rang mai mare
if (RG[x]==RG[y]) RG[y]++; //in caz ca rangurile erau egale atunci cresc rangul noii multimi cu 1
}
int main()
{ f>>N>>M;
for(int i=1;i<=N;i++)//initial fiecare nod pointeaza catre el insusi iar rangul fiecarui arbore este 1
{TT[i]=i; RG[i] = 1;}
for(int cd,x,y,i=1;i<=M;i++)
{ 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 unite(find(x),find(y));//unesc radacinile arborilor corespunzatori multimilor nodurilor x respectiv y
}
g.close(); return 0;
}