Cod sursa(job #2073199)

Utilizator kovacsattilaKovacs Attila kovacsattila Data 22 noiembrie 2017 19:54:08
Problema Paduri de multimi disjuncte Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.47 kb
#include <stdio.h>
#include <stdlib.h>

#define NMAX 10000

int tomb[NMAX];
int hossz[NMAX];

FILE * fout;

int root(int pont)
{
    int i = pont;
    while(i != tomb[i])
    {
        tomb[i] = tomb[tomb[i]];
        i = tomb[i];

    }
    return i;
}

void unite(int pont1,int pont2)
{
    int root1,root2;
    root1 = root(pont1);
    root2 = root(pont2);

    if(root1 != root2)
    {
        if(hossz[root1] > hossz[root2])
        {
            tomb[root2] = root1;
            hossz[root1] += hossz[root2];
        }
        else
        {
            tomb[root1] = root2;
            hossz[root2] += hossz[root1];
        }
    }

}

void querry(int pont1,int pont2)
{
    int root1,root2;
    root1 = root(pont1);
    root2 = root(pont2);

    if(root1 == root2)
    {
        fprintf(fout,"DA\n");
    }
    else
    {
        fprintf(fout,"NU\n");
    }
}

int main()
{
    FILE * fin = fopen("disjoint.in","r");
    fout = fopen("disjoint.out","w");
    int cs,e;
    int i;

    fscanf(fin,"%i %i",&cs,&e);

    for(i = 1; i <= cs; ++i)
    {
        tomb[i] = i;
        hossz[i] = 1;
    }

    int muvelet,pont1,pont2;
    for(i = 1; i <= e; ++i)
    {
        fscanf(fin,"%i %i %i",&muvelet,&pont1,&pont2);

        if(muvelet == 1)
        {
            unite(pont1,pont2);
        }
        else
        {
            querry(pont1,pont2);
        }
    }

    free(tomb);
    return 0;
}