Cod sursa(job #1336402)

Utilizator Arodoet96Teodora Stoleru Arodoet96 Data 7 februarie 2015 17:59:25
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#define NMAX 100004

using namespace std;

FILE*fin=fopen("disjoint.in", "r");
FILE*fout=fopen("disjoint.out", "w");

int n, m;
int tata[NMAX];
int h[NMAX];//h[i]=inaltimea arborelui cu radacina i

void citire();
void initializare();
int gasesc(int x);
int Find(int x);
void Union(int i, int j);

int main()
{
    citire();
    return 0;
}

void citire()
{
    int i, cod, x, y, cx, cy, nr1, nr2;

    fscanf(fin, "%d %d", &n, &m);
    initializare();

    for(i=1;i<=m;i++)
    {
        fscanf(fin, "%d %d %d", &cod, &x, &y);

        cx=Find(x);
        cy=Find(y);

        if(cod==1)
            Union(cx, cy);
            else
            {
                if(cx==cy) fprintf(fout, "DA\n");//fout<<"1\n";
                    else fprintf(fout, "NU\n");//fout<<"0\n";
            }
    }
}

void initializare()
{
    int i;
    for(i=1;i<=n;i++)
        h[i]=1;
}

int Find(int x)
{
    //caut radacina
    int rad=x, aux;
    while(tata[rad]) rad=tata[rad];
    while(tata[x]) {aux=tata[x]; tata[x]=rad; x=aux;}
    return rad;
}

void Union(int i, int j)
{
    //i, j=radacinile arborilor care reprezinta cele 2 submultimi
    if(h[i]<h[j])//i devine fiu al lui j
        tata[i]=j;
        else
        {
            tata[j]=i;
            if(h[i]==h[j])
                h[i]++;
        }
}