Cod sursa(job #1217283)

Utilizator AndreiBarbutaAndrei Barbuta AndreiBarbuta Data 7 august 2014 00:05:10
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#define IN "disjoint.in"
#define OUT "disjoint.out"

using namespace std;

const int MAX=100014;
int rang[MAX],tata[MAX];

ifstream fin(IN);
ofstream fout(OUT);

int stramos(int nod);
void unire(int nod1, int nod2);

int main()
{
    int n,m,x,y,z;
    fin>>n>>m;
    for(register int i=1;i<=n;i++){
        tata[i]=i;
        rang[i]=1;
    }
    while(m--){
        fin>>z>>x>>y;
        if(z==2){
            if(stramos(y)==stramos(x))
                fout<<"DA"<<'\n';
            else
                fout<<"NU"<<'\n';
        }
        else{
            x=stramos(x);
            y=stramos(y);
            unire(x,y);
        }
    }
    return 0;
}

int stramos(int nod){
    int x=nod;
    while(nod!=tata[nod])
        nod=tata[nod];
    while(x!=tata[x]){
        x=tata[x];
        tata[x]=nod;
    }
    return nod;
}

void unire(int nod1, int nod2){
    if(rang[nod1]>=rang[nod2]){
        tata[nod2]=nod1;
        rang[nod1]+=rang[nod2];
    }
    else{
        tata[nod1]=nod2;
        rang[nod2]+=rang[nod1];
    }
}