Cod sursa(job #1512626)

Utilizator adina0822Ciubotaru Adina-Maria adina0822 Data 28 octombrie 2015 13:09:12
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
using namespace std;
#include <fstream>
#define Nmax 100020
FILE *f=fopen ("disjoint.in", "r");
FILE *g=fopen ("disjoint.out", "w");

int TT[Nmax];//vectorul cu stramosi
int RG[Nmax];//rangul arborelui
int N,M;

int rad(int x)
{
    int R,y;
    //aflam radacina arborelui care il contine pe x
    for(R=x;TT[R]!=R; R=TT[R]);

    //toti stramosii lui x vor avea aceeasi radacina
    //deci in vectorul TT in care retinem primul stramos al lui x
    //vom retine radacina
    while(TT[x]!=x)
    {
        y=TT[x]; //
        TT[x]=R;
        x=y;
    }
    return R;
}

void unite(int x,int y)
{
    //unim multimea de rang mai mic de cea cu rang mai mare
    if(RG[x]>RG[y])
        TT[y]=x;
    else TT[x]=y;
    if(RG[x]==RG[y]) RG[y]++;
}



int main()
{
    fscanf(f,"%d%d", &N,&M);
    int i,x,y,cd;
    //la inceput fiecare arbore are radacina i si rangul 1
    for(i=1; i<=N; i++)
    {
        TT[i]=i;
        RG[i]=1;
    }

    for(i=1; i<=M; i++)
    {
        fscanf(f,"%d%d%d",&cd,&x,&y);
        if(cd==2)
        {
            if(rad(x)==rad(y))fprintf(g,"DA\n");
            else fprintf(g,"NU\n");
        }
        else
        {
            unite(rad(x),rad(y));
        }

    }



    return 0;
}