Cod sursa(job #1024159)

Utilizator mazaandreiAndrei Mazareanu mazaandrei Data 8 noiembrie 2013 12:27:10
Problema Paduri de multimi disjuncte Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include<fstream>
using namespace std;
//Varianta 1 : fara euristice
int t[100001];
int p[100001];
int h[100001];
int n,m,x,y,tip;
ifstream in("disjoint.in"); ofstream out("disjoint.out");
int radacina(int x){
    while(t[x]!=0) x=t[x];
    return x;
}
void reunit(int x, int y){
    int tx=radacina(x);
    int ty=radacina(y);
    if(h[tx]>h[ty]){ //cel mai mic se adauga la cel mai mare
        h[tx]+=h[ty];
        t[ty]=x;
    }
    else{
        h[ty]+=h[tx];
        t[tx]=y;
    }
}

int main(){
    in>>n>>m;
    for(int i=1;i<=n;++i) h[i]=1,p[i]=i;
    for(int i=1;i<=m;++i){
        in>>tip>>x>>y;
        if(tip==1) reunit(x,y);
        else{
            if(radacina(x)==radacina(y)) out<<"DA\n";
            else out<<"NU\n";
        }
    }
    out.close();
    return 0;
}