Cod sursa(job #1739111)

Utilizator DevilOnFieldTudor Horia Niculescu DevilOnField Data 8 august 2016 17:12:03
Problema Paduri de multimi disjuncte Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.99 kb
#include<stdio.h>

FILE *in, *out;

int v[100001], siz[100001];

void uneste(int a, int b)
{
    a = cap(a);
    b = cap(b);
    if(siz[a] == siz[b]) {
        v[b] = a;
        siz[a]++;
    } else {
        if(siz[a] > siz[b]) {
            v[b] = a;
        } else {
            v[a] = b;
        }
    }
}

int cap(int nod)
{
    if(v[nod] != nod) {
        v[nod] = cap(v[nod]);
    }
    return v[nod];
}

int main () {

    int i, q, a, b, o, n;

    in = fopen("disjoint.in", "r");
    out = fopen("disjoint.out", "w");

    fscanf(in, "%d%d", &n, &q);

    for(i = 1; i <= n; i++) {
        v[i] = i;
        siz[i] = 1;
    }

    for(i = 0; i < q; i++) {
        fscanf(in, "%d%d%d", &o, &a, &b);
        if(o == 1) {
            uneste(a, b);
        } else {
            if(cap(a) == cap(b)) {
                fprintf(out, "DA");
            } else {
                fprintf(out, "NU");
            }
            fprintf(out, "\n");
        }
    }

    fclose(in);
    fclose(out);
    return 0;
}