Cod sursa(job #2212975)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 15 iunie 2018 14:33:40
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>

using namespace std;

ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

int N;
int K;
int m[100001];
int sz[100001];

int Find(int a)
{
  int root=a;
  int temp;

  while( root != m[root])
    root=m[root];

  while( a != m[a])
  {
    temp=m[a];
    m[a]=root;
    a=temp;
  }

  return root;
}

void Check(int a,int b)
{
  int root_a=Find(a);
  int root_b=Find(b);

  if(root_a==root_b) fout<<"DA"<<'\n';
  else fout<<"NU"<<'\n';
}

void Init()
{
  for(int i=1; i<=N; ++i)
   m[i]=i,
   sz[i]=1;
}

void Unite(int a,int b)
{
  int root_a,root_b;

  root_a=Find(a);
  root_b=Find(b);

  if(sz[root_a] > sz[root_b])
  { m[root_b]=root_a;
    sz[root_a]+=sz[root_b];
  }
  else
  { m[root_a]=root_b;
    sz[root_b]+=sz[root_a];
  }
}

void Read()
{
  fin>>N>>K;

  Init();

  int tip,a,b;

  for(int i=1; i<=K; ++i)
   {
     fin>>tip>>a>>b;

     if(tip==1) Unite(a,b);
     if(tip==2) Check(a,b);
   }

  fin.close();
  fout.close();
}

int main()
{
    Read();

    return 0;
}