Cod sursa(job #1235703)

Utilizator Alex_dudeDudescu Alexandru Alex_dude Data 30 septembrie 2014 12:33:53
Problema Paduri de multimi disjuncte Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <stdio.h>
#define NMAX 100001
using namespace std;
FILE * f= fopen("disjoint.in","r"),* g = fopen("disjoint.out","w");
int x1,y1;
int RG[NMAX],TT[NMAX];
int search1(int x)
{
    int aux=x,aux1;
    if(TT[x]!=x)return search1(TT[x]);
    while(TT[aux]!=aux){aux1=TT[aux];TT[aux]=x;aux=aux1;}
    return x;
}
void unite (int x, int y)
{
  if(RG[x]>RG[y])TT[y1]=x1;
  else TT[x1]=y1;
  if (RG[x] == RG[y]) {RG[y]++;}
}
int n,m;
int main()
{
    fscanf(f,"%d %d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        TT[i]=i;
        RG[i]=1;
    }
    int cod,x,y;
    for(int i=1;i<=m;i++)
    {
                fscanf(f,"%d %d %d",&cod,&x,&y);
        x1=search1(x);
        y1=search1(y);
                if(cod == 2)
        {
            if(x1==y1)fprintf(g,"%s\n","DA");
            else fprintf(g,"%s\n","NU");
        }
        else
        {
           // if (search1(x) == search1(y))  {fprintf(g,"%d ", i);return 0;}
            unite(x,y);
        }

    }
    fclose(f);
    fclose(g);
    return 0;
}