Cod sursa(job #2212969)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 15 iunie 2018 14:19:37
Problema Paduri de multimi disjuncte Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#include <deque>

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 c=a;
  int root;

  deque <int> temp;

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

  root=a;

  while(!temp.empty())
  {
    m[temp.back()]=root;
    temp.pop_back();
  }

  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];
  }

  if(sz[root_a]==sz[root_b]) ++sz[root_b];
}

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;
}