Cod sursa(job #826172)

Utilizator plusplusRares M. plusplus Data 30 noiembrie 2012 13:19:39
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <cstdio>
#define NMAX 100001

using namespace std;

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

int T[NMAX], R[NMAX];
int N, M;

int FindSet(int nod) {
    if(nod != T[nod])
        T[nod] = FindSet(T[nod]);
    return T[nod];
}

void UnionSet(int a, int b) {
    a = FindSet(a);
    b = FindSet(b);
    if(R[a] < R[b]) T[a] = T[b];
    else T[b] = T[a];
    if(R[a] == R[b]) R[a] = R[a] + 1;
}

void read() {
    int i, cod, a, b;
    fscanf(fin, "%d %d", &N, &M);
    for(i = 1; i <= N; i = i + 1) {
        T[i] = i;
        R[i] = 0;
    }
    for(i = 1; i <= M; i = i + 1) {
        fscanf(fin, "%d %d %d", &cod, &a, &b);
        if(cod == 1) UnionSet(a, b);
        else if(FindSet(a) == FindSet(b)) fprintf(fout, "DA\n");
        else fprintf(fout, "NU\n");
    }
}

int main() {
    read();
    return 0;
}