Cod sursa(job #1705908)

Utilizator catcatCatalina catcat Data 21 mai 2016 03:43:30
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <stdio.h>

#define MAX_NODES 100000

int root[MAX_NODES + 1];
int size[MAX_NODES + 1];

int get_root(int node) {
    while (node != root[node]) {
        root[node] = root[root[node]];
        node = root[node];
    }
    return node;
}
 
int find(int p, int q) {
    return get_root(p) == get_root(q);
}

void unite(int p, int q) {
    int i = get_root(p);
    int j = get_root(q);

    if (size[i] < size[j]) {
        root[i] = j;
        size[j] += size[i];
    } else {
        root[j] = i;
        size[i] += size[j];
    }
}

int main(void) {
    FILE * fin = fopen("disjoint.in", "r");
    FILE * fout = fopen("disjoint.out", "w");
    
    int n, m, x, y, op;
    
    fscanf(fin, "%d%d", &n, &m);
    
    for (int i = 1; i <= n; i++) {
        root[i] = i;
        size[i] = 1;
    }
    
    for (int i = 0; i < m; i++) {
        fscanf(fin, "%d%d%d", &op, &x, &y);
        if (op == 1) {
            unite(x, y);
        } else {
            if (find(x, y)) {
                fprintf(fout, "DA\n");
            } else {
                fprintf(fout, "NU\n");
            }
        }
    }
    
    fclose(fin);
    fclose(fout);
}