Cod sursa(job #1669032)

Utilizator cristina_dCristina Danila cristina_d Data 30 martie 2016 11:58:45
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <cstdio>
using namespace std;
const int NMAX = 100000;
int t[NMAX + 5];
int h[NMAX + 5];
int FindSet(int x){
    while(x != t[x])
        x = t[x];
    return x;
}
void UnionSet(int x, int y){
    if(h[x] > h[y])
        t[y] = x;
    else
        if(h[y] > h[x])
            t[x] = y;
        else{
            h[x]++;
            t[y] = x;
        }
}
int main(){
    FILE *fin, *fout;
    fin = fopen ("disjoint.in", "r");
    fout = fopen ("disjoint.out", "w");
    int n, m, i, k, x, y, tx, ty;
    fscanf(fin, "%d%d", &n, &m);
    for(i = 1; i <= n; i++){
        t[i] = i;
        h[i] = 1;
    }
    for(i = 1; i <= m; i++){
        fscanf(fin, "%d%d%d", &k, &x, &y);
        if(k == 1){
            tx = FindSet(x);
            ty = FindSet(y);
            if(tx != ty)
                UnionSet(tx, ty);
        }
        else{
            tx = FindSet(x);
            ty = FindSet(y);
            if(tx == ty)
                fprintf(fout, "DA\n");
            else
                fprintf(fout, "NU\n");
        }
    }
    fclose( fin );
    fclose( fout );
    return 0;
}