Cod sursa(job #1253634)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 1 noiembrie 2014 16:01:53
Problema Paduri de multimi disjuncte Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.03 kb
#include <stdio.h>
#define MAXN 100000
int t[MAXN+1], h[MAXN+1];
int find(int p){
    if(t[p]==p){
        return p;
    }
    t[p]=find(t[p]);
    return t[p];
}
inline void unite(int x, int y){
    int rx, ry;
    rx=find(x);
    ry=find(y);
    if(h[rx]<h[ry]){
        t[rx]=ry;
    }else if(h[rx]>h[ry]){
        t[ry]=rx;
    }else{
        t[rx]=ry;
        h[ry]++;
    }
}
inline void init(int n){
    int i;
    for(i=1; i<=n; i++){
        h[i]=1;
        t[i]=i;
    }
}
int main(){
    int n, q, i, x, y, t;
    FILE *fin, *fout;
    fin=fopen("disjoint.in", "r");
    fout=fopen("disjoint.out", "w");
    fscanf(fin, "%d%d", &n, &q);
    init(n);
    for(i=0; i<q; i++){
        fscanf(fin, "%d%d%d", &t, &x, &y);
        if(t==1){
            unite(x, y);
        }else{
            if(find(x)==find(y)){
                fprintf(fout, "DA\n");
            }else{
                fprintf(fout, "NU\n");
            }
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}