Cod sursa(job #2335498)

Utilizator david.sachelarieDavid Sachelarie david.sachelarie Data 4 februarie 2019 10:50:32
Problema Paduri de multimi disjuncte Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <stdio.h>
#include <stdlib.h>
int sef[100000],temp[100000];
void calcDaBoss(int n){
    int i;
    for(i=0;i<n;i++)
        sef[i]=i;
}
void unionMul(int x,int y){
    while(sef[x]!=x)
        x=sef[x];
    while(sef[y]!=y)
        y=sef[y];
    sef[x]=sef[y];
}
int find(int x,int y){
    int i=0,j;
    while(sef[x]!=x){
        temp[i]=x;
        x=sef[x];
        i++;
    }
    for(j=0;j<i;j++){
        sef[temp[j]]=x;
    }
    i=0;
    while(sef[y]!=y){
        temp[i]=y;
        y=sef[y];
        i++;
    }
    for(j=0;j<i;j++){
        sef[temp[j]]=y;
    }
    if(sef[x]==sef[y])
        return 1;
    else
        return 0;
}
int main()
{
    FILE*fin,*fout;
    int n,m,code,x,y,val,i;
    fin = fopen("disjoint.in" ,"r");
    fout = fopen("disjoint.out" ,"w");
    fscanf(fin, "%d%d" ,&n,&m);
    calcDaBoss(n);
    for(i=0;i<m;i++){
        fscanf(fin, "%d%d%d" ,&code,&x,&y);
        if(code==1){
            unionMul(x,y);
        }
        else{
            val=find(x,y);
            if(val==0)
                fprintf(fout, "NU\n");
            else
                fprintf(fout, "DA\n");
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}