Cod sursa(job #1815872)

Utilizator gorneanu.andreiFMI Gorneanu Andrei gorneanu.andrei Data 25 noiembrie 2016 21:04:24
Problema Paduri de multimi disjuncte Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.12 kb
#include <stdio.h>
#define MAXN 100001

void add(int x,int y,int tata[MAXN],int h[MAXN]){

    while(tata[x] != 0)
        x = tata[x];
    while(tata[y] != 0)
        y = tata[y];

    if(h[x] < h[y]){
        tata[x] = y;
        h[y] = h[y] + 1;
    }
    else{
        tata[y] = x;
        h[x] = h[x] + 1;
    }
}

int query(int x,int y,int tata[MAXN],int h[MAXN]){

    while(tata[x] != 0)
        x = tata[x];
    while(tata[y] != 0)
        y = tata[y];

    if(x == y)
        return 1;
    return 0;
}

int main(){

    int n, m, i, tata[MAXN],h[MAXN], mod, x, y;
    FILE *f, *g;
    f = fopen("disjoint.in","r");
    g = fopen("disjoint.out","w");
    fscanf(f,"%d %d",&n,&m);

    for(i = 1;i <= n; ++i){
        tata[i] = 0;
        h[i] = 0;
    }

    for(i = 1;i <= m; ++i){
        fscanf(f,"%d %d %d",&mod,&x,&y);
        if(mod == 1)
            add(x,y,tata,h);
        else{
            x = query(x,y,tata,h);
            if(x == 1)
                fprintf(g,"%s\n","DA");
            else
                fprintf(g,"%s\n","NU");
            }
    }

    return 0;
}