Cod sursa(job #2201417)

Utilizator BarbumateiBarbu Matei Barbumatei Data 4 mai 2018 18:13:11
Problema Paduri de multimi disjuncte Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <cstdio>
#define NMAX 100000
int tata[NMAX], rang[NMAX];

int comp( int nod ) {
  int R = nod, aux;
  while ( R != tata[R] )
    R = tata[R];
  while ( nod != R ) {
    aux = tata[nod];
    tata[nod] = R;
    nod = aux;
  }
  return R;
}

void uneste( int x, int y ) {
  int dad1 = comp( x ), dad2 = comp( y );
  if ( rang[dad1] > rang[dad2] )
    tata[y] = dad1;
  else
    tata[x] = dad2;
  if ( rang[dad1] == rang[dad2] )
      rang[y]++;
}

int main() {
  FILE *fin, *fout;
  fin = fopen( "disjoint.in", "r" );
  fout = fopen( "disjoint.out", "w" );
  int n, m, i, cerinta, x, y;
  fscanf( fin, "%d%d", &n, &m );
  for ( i = 0; i < n; i++ ) {
    tata[i] = i;
    rang[i] = 1;
  }
  while ( m-- ) {
    fscanf( fin, "%d%d%d", &cerinta, &x, &y );
    x--; y--;
    if ( cerinta == 1 )
      uneste( x, y );
    else {
      if ( comp( x ) == comp( y ) )
        fprintf( fout, "DA\n" );
      else
        fprintf( fout, "NU\n" );
    }
  }
  fclose( fin );
  fclose( fout );
    return 0;
}