Pagini recente » Istoria paginii utilizator/armasanea | Cod sursa (job #3195540) | Statistici Teodor G (teodorg) | Borderou de evaluare (job #1530644) | Cod sursa (job #749741)
Cod sursa(job #749741)
#include <fstream>
using namespace std;
#define nmax 100010
int RANK[nmax],TATA[nmax];
int radacina(int nod){//cand caut radacina, fac si compresia drumurilor
//nu modific rank-ul pt niciun nod
int rad,aux;
for(rad=nod;rad!=TATA[rad];rad=TATA[rad]);
//acum rad este radacina arborelui
//mai parcurg odata ca sa fac compresia
for(;nod!=TATA[nod];){aux=TATA[nod];TATA[nod]=rad;nod=aux;}
return rad;
}
void reuniune(int a, int b){
if(RANK[a]>RANK[b]){//il lipesc pe cel mic de cel mare
TATA[b]=a;
}else TATA[a]=b;
if(RANK[a]==RANK[b])RANK[b]++;
}
int main(){
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int n,m;
int cod,a,b;
fin>>n>>m;
int i;
for(i=1;i<=n;i++){
TATA[i]=i;
RANK[i]=1;
}
for(i=0;i<m;i++){
fin>>cod>>a>>b;
switch(cod){
case 1://reuniune
reuniune(radacina(a),radacina(b));
break;
case 2://intrebare
if(radacina(a)==radacina(b)){
fout<<"DA"<<"\n";
}else fout<<"NU"<<"\n";
break;
}
}
return 0;
}