Cod sursa(job #2846695)

Utilizator mihaipriboimihailucapriboi mihaipriboi Data 9 februarie 2022 15:47:22
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
// Mihai Priboi

#include <stdio.h>
#include <algorithm>

#define MAXN 100000

int parent[MAXN + 1], depth[MAXN + 1];

void build( int n ) {
  int i;
  for( i = 1; i <= n; i++ )
    parent[i] = i;
}

int find( int val ) {
  if( parent[val] == val )
    return val;
  return parent[val] = find(parent[val]);
}

void unite( int a, int b ) {
  int setA, setB;
  setA = find(a);
  setB = find(b);

  if( depth[setA] < depth[setB] )
    std::swap(setA, setB);
  
  parent[setB] = setA;

  if( depth[setA] == depth[setB] )
    depth[setA]++;
}

int main() {
  FILE *fin, *fout;
  int n, m, cod, x, y, i;
  fin = fopen( "disjoint.in", "r" );
  fout = fopen( "disjoint.out", "w" );

  fscanf( fin, "%d%d", &n, &m );
  build(n);

  for( i = 0; i < m; i++ ) {
    fscanf( fin, "%d%d%d", &cod, &x, &y );

    if( cod == 1 )
      unite(x, y);
    else {
      if( find(x) == find(y) )
        fprintf( fout, "DA\n" );
      else
        fprintf( fout, "NU\n" );
    }
  }

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