Pagini recente » Cod sursa (job #1054767) | Cod sursa (job #2025574) | Cod sursa (job #2058123) | Cod sursa (job #1806647) | Cod sursa (job #2938006)
#include<fstream>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
//vector de elemente, in care indexu reprezinta elementu
//si valoarea este fie un alt element din multime fie radacina multimii atunci cand indexu = valoarea
int *multimi;
int *rankuri;
//radacina multimii spune multimea in care se afla
//asa ca mergem din element in element pana dam de radacina
//pentru a simplifica viitoare cautari, toate elementele vizitate vor primi valoarea radacinii
//O(logN)
int gaseste(int x){
if(multimi[x]==x)
return x;
return multimi[x]=gaseste(multimi[x]);
}
//radacina unei multimi devine element in multimea altuia
void uneste(int x, int y){
int m1 = gaseste(x);
int m2 = gaseste(y);
if(rankuri[m1]==rankuri[m2]){
multimi[m1]=m2;
rankuri[m1]++;
}
else if(rankuri[m1]>rankuri[m2]){
multimi[m1]=m2;
}
else{
multimi[m2]=m1;
}
}
int main(){
int n,m;
fin>>n>>m;
//initializam elementele, toate elementele sunt radacini initial
multimi=new int[n+1];
rankuri=new int[n+1];
for(int i=1;i<=n;i++)
multimi[i]=i, rankuri[i]=1;
int cod,x,y;
while(fin>>cod>>x>>y){
if(cod==1)
uneste(x,y);
else{
fout<<(gaseste(x)==gaseste(y)?"DA\n":"NU\n");
}
}
return 0;
}
//complexitate timp: O(1) pentru unire O(log*N)~O(1) pentru gasire (conform indicatiilor de rezolvare)
//complexitate memorie: O(n)