Pagini recente » Cod sursa (job #1337240) | Cod sursa (job #2044273) | Cod sursa (job #135362) | Cod sursa (job #2179075) | Cod sursa (job #1785027)
#include <fstream>
#include <cstdlib>
using namespace std;
FILE *f = fopen("disjoint.in", "rt");
ofstream out("disjoint.out");
int TT[100002], RG[100002]; // tt - nodul de pe poz i pointeaza catre nod[i] rg - vec de ranguri
int n, m;
int find(int nod){
int r, x;// r-radacina
//parcurg arborele in sus pana la un nod care pointeaza catre el insusi
for(r = nod;TT[r] != r;r = TT[r]);
//compresie drumuri
while(TT[nod] != nod){
x=TT[nod];
TT[nod]=r;
nod=x;
}
return r;
}
void unite(int x, int y){
if(RG[x]>RG[y]) //rg1 = rg2 => unim radacinile deci multimile
TT[y]=x;
else TT[x]=y;
if(RG[x]==RG[y])//mult cu rang egal => crestem unul dintre rg
RG[y]++;
}
int main()
{
fscanf(f, "%d%d", &n, &m);
for(int i=1;i<=n;i++){
TT[i] = i;
RG[i] = 1;
}
int cod, x, y;
for(int i=1;i<=m;i++){
fscanf(f, "%d%d%d", &cod, &x, &y);
if(cod == 2){
if(find(x)==find(y)) out<<"DA"<< '\n';
else out<< "NU" << '\n';
}
else{
unite(find(x),find(y));
}
}
return 0;
}