Cod sursa(job #2073202)

Utilizator hammasattilaHammas Attila hammasattila Data 22 noiembrie 2017 19:56:53
Problema Paduri de multimi disjuncte Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.27 kb
#include <stdio.h>
#include <stdlib.h>

#define NMAX 100001

int n, m, tab[NMAX], len[NMAX];
FILE *f, *g;

int root(int a)
{
    while(tab[a] != a) {
        a = tab[a];
    }

    return a;
}

void unite(int a, int b)
{
    int root1 = root(a), root2 = root(b);

//    if(root1 != root2) {
//        tab[root1] = root2;
//    }
    if(root1 != root2) {
        if(len[root1] > len[root2]) {
            tab[root1] = root2;
            len[root2] = len[root1];
        } else {
            tab[root2] = root1;
            len[root1] = len[root2];
        }
    }
}

void query(int a, int b)
{
    int root1 = root(a), root2 = root(b);

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

int main()
{
    f = fopen("disjoint.in", "r");
    g = fopen("disjoint.out", "w");
    if(f == NULL) { return -1; }
    if(g == NULL) { return -1; }

    fscanf(f, "%d %d\n", &n, &m);

    for(int i = 0; i < n; ++i) {
        tab[i] = i;
        len[i] = 1;
    }

    for(int i = 0; i < m; ++i) {
        int a, b, c;
        fscanf(f, "%d %d %d\n", &a, &b, &c);
        if(a == 1) { unite(b, c); }
        if(a == 2) { query(b, c); }
    }

    fclose(f);
    fclose(g);
    return 0;
}