Cod sursa(job #920188)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 20 martie 2013 09:16:17
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>
#include <vector>
using namespace std;

struct DSFel{
    unsigned rank;
    DSFel *parent;
    DSFel(){rank=0;}
};

DSFel* Find(DSFel* x){
    if(x->parent==x) return x;
    else{
        x->parent=Find(x->parent);
        return x->parent;
    }
}

void Union(DSFel *x,DSFel *y){
    DSFel *xroot=Find(x),*yroot=Find(y);
    if(xroot==yroot) return;
    if(xroot->rank>yroot->rank)
        yroot->parent=xroot;
    else if(xroot->rank<yroot->rank)
        xroot->parent=yroot;
    else{
        xroot->parent=yroot;
        (yroot->rank)++;
    }
}

int main(){
    ifstream fin("disjoint.in");
    ofstream fout("disjoint.out");

    unsigned N,M;
    fin>>N>>M;
    vector<DSFel> elements(N);
    for(unsigned i=0;i<N;++i) elements[i].parent=&elements[i];

    while(M--){
        short t,x,y; fin>>t>>x>>y; x--; y--;
        if(t==1) Union(&elements[x],&elements[y]);
        if(t==2){
            if(Find(&elements[x])==Find(&elements[y])) fout<<"DA\n";
            else fout<<"NU\n";
        }
    }
}