Cod sursa(job #1785027)

Utilizator StormLawGorea Ioan StormLaw Data 20 octombrie 2016 20:07:36
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <cstdlib>
using namespace std;
FILE *f = fopen("disjoint.in", "rt");
ofstream out("disjoint.out");

int TT[100002], RG[100002]; // tt - nodul de pe poz i pointeaza  catre nod[i] rg - vec de ranguri
int n, m;

int find(int nod){
    int r, x;// r-radacina
    //parcurg arborele in sus pana la un nod care pointeaza catre el insusi
    for(r = nod;TT[r] != r;r = TT[r]);

    //compresie drumuri
    while(TT[nod] != nod){
        x=TT[nod];
        TT[nod]=r;
        nod=x;
    }
    return r;
}

void unite(int x, int y){
    if(RG[x]>RG[y]) //rg1 = rg2 => unim radacinile deci multimile
        TT[y]=x;
    else TT[x]=y;

    if(RG[x]==RG[y])//mult cu rang egal => crestem unul dintre rg
        RG[y]++;
}

int main()
{
    fscanf(f, "%d%d", &n, &m);
    for(int i=1;i<=n;i++){
        TT[i] = i;
        RG[i] = 1;
    }

    int cod, x, y;
    for(int i=1;i<=m;i++){
        fscanf(f, "%d%d%d", &cod, &x, &y);
        if(cod == 2){
            if(find(x)==find(y)) out<<"DA"<< '\n';
            else out<< "NU" << '\n';
        }
        else{
            unite(find(x),find(y));
        }
    }

    return 0;
}