Cod sursa(job #1112798)

Utilizator manutrutaEmanuel Truta manutruta Data 20 februarie 2014 00:34:39
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <cstdio>
using namespace std;

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

#define MAXN 100005

int nod[MAXN],rang[MAXN],n,m;

int find(int x){
    int r,y;
    for(r=x;nod[r]!=r;r=nod[r]);

    while(nod[x]!=x){
        y=nod[x];
        nod[x]=r;
        x=y;
    }
}

void update(int x,int y){
    x=find(x),y=find(y);
    if(rang[x]>rang[y]){
        nod[y]=x;
    }else{
        nod[x]=y;
    }

    if(rang[x]==rang[y]){
        rang[y]++;
    }
}

bool query(int x,int y){
    return find(x)==find(y);
}

int main(){
    fscanf(fin,"%d %d\n",&n,&m);

    for(int i=1;i<=n;i++){
        nod[i]=i,rang[i]=1;
    }

    int tip,x,y;
    for(int i=0;i<m;i++){
        fscanf(fin,"%d %d %d\n",&tip,&x,&y);
        switch(tip){
            case 1:
                update(x,y);
                break;
            case 2:
                if(query(x,y)){
                    fprintf(fout,"DA\n");
                }else{
                    fprintf(fout,"NU\n");
                }
                break;
        }
    }

    fclose(fin);
    fclose(fout);
    return 0;
}