Cod sursa(job #2117727)

Utilizator andrei.gramescuAndrei Gramescu andrei.gramescu Data 29 ianuarie 2018 12:57:21
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<cstdio>
#include<vector>
using namespace std;
#define NMAX 100005
int point[NMAX];

int gaseste(int nod)
{
    if(point[nod]==nod)
        return nod;
    else{
        point[nod] = gaseste( point[nod] );
        return point[nod];
    }
}

void unite(int a, int b)
{
    int capa = gaseste( a );
    int capb = gaseste( b );

    if(capa != capb){
        if(capa >= capb){
            point[capb]=capa;
        }
        else{
            point[capa]=capb;
        }
    }
}

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

    ///declarare
    int n, k, i, a, b, j;

    ///citire
    fscanf(fin, "%d%d", &n, &k);

    ///umplere
    for(i=1; i<=n; i++)
        point[i]=i;

    ///implementare
    for(i=1; i<=k; i++)
    {
        fscanf(fin, "%d", &j);
        if( j==1 ){
            fscanf(fin, "%d%d", &a, &b);
            unite(a, b);
        }
        else{
            fscanf(fin, "%d%d", &a, &b);
            point[a] = gaseste( a );
            point[b] = gaseste( b );
            if(point[a]==point[b])
                fprintf(fout, "DA\n");
            else fprintf(fout, "NU\n");
        }
    }

    ///end
    fclose( fin );
    fclose( fout );

    return 0;
}