Cod sursa(job #2706906)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 16 februarie 2021 08:27:39
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
//Ilie Dumitru
#include<cstdio>

int rang[100000], tata[100000], N, M;

int gaseste_radacina(int x)
{
    int r, y;
    for(r=x;r!=tata[r];r=tata[r]);
    for(;x!=r;x=y)
    {
        y=tata[x];
        tata[x]=r;
    }
    return r;
}

void uneste(int x, int y)
{
    int r1, r2;
    r1=gaseste_radacina(x);
    r2=gaseste_radacina(y);
    if(rang[r1]<rang[r2])
        tata[r1]=r2;
    else
        tata[r2]=r1;
    if(rang[r1]==rang[r2])
        rang[r2]++;
}

int main()
{
    int i, a, b, c;
    FILE *f=fopen("disjoint.in", "r"), *g=fopen("disjoint.out", "w");
    fscanf(f, "%i", &N);
    fscanf(f, "%i", &M);
    for(i=0;i<N;++i)
    {
        rang[i]=1;
        tata[i]=i;
    }
    for(i=0;i<M;++i)
    {
        fscanf(f, "%i", &a);
        fscanf(f, "%i", &b);
        fscanf(f, "%i", &c);
        --b;
        --c;
        if(a==1)
            uneste(b, c);
        else
        {
            if(gaseste_radacina(b)==gaseste_radacina(c))
                fprintf(g, "DA\n");
            else
                fprintf(g, "NU\n");
        }
    }
    fclose(f);
    fclose(g);
    return 0;
}