Cod sursa(job #2357460)

Utilizator BogdanAlexandruBogdan-Alexandru Dig BogdanAlexandru Data 27 februarie 2019 13:49:41
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <stdio.h>

using namespace std;
FILE *f,*g;

int Father[100010],Rank[100010];
int N,M;
void Update()
{
    while(N)Father[N]=N,--N;

}
void Unific(int A,int B)
{
   if(Rank[A]>Rank[B])Father[B]=A;
   else Father[A]=B;
   if(Rank[A]==Rank[B]) Rank[A]++;
}
int FindFather(int Node)
{
   if(Node!=Father[Node])Father[Node]=FindFather(Father[Node]);
   return Father[Node];
}
int YesOrNot(int A,int B)
{
    if(Father[A]==Father[B])return 1;
    return 0;
}
void ReadAndSolve()
{
    int i,X,Y,task,rootA,rootB;
    fscanf(f,"%d %d",&N,&M);
    Update();
    for(i=1;i<=M;++i)
    {
        fscanf(f,"%d %d %d",&task,&X,&Y);
        rootA=FindFather(X);rootB=FindFather(Y);
        if(task==1)Unific(rootA,rootB);
        else
            if(YesOrNot(rootA,rootB))fprintf(g,"DA\n");
            else fprintf(g,"NU\n");
    }
}
int main()
{
    f=fopen("disjoint.in","r");g=fopen("disjoint.out","w");
    ReadAndSolve();
    fclose(f);fclose(g);
    return 0;
}