Cod sursa(job #1496285)

Utilizator refugiatBoni Daniel Stefan refugiat Data 4 octombrie 2015 18:10:18
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include<fstream>
#define elemax 100002
using namespace std;
int rad[elemax];

int tata(int x)
{
  int t=rad[x];
  while(t!=rad[t])
    t=rad[t];
  return t;
}
bool query(int a, int b)
{
  int t1,t2;
  t1=tata(a);
  t2=tata(b);
  return (t1==t2);
}

// Uneste multimea lui a cu multimea lui b
inline void uneste(int a, int b)
{
  int t1=tata(a),t2=tata(b);
  if((a+b) & 1)
    rad[t2]=rad[t1];
  else
    rad[t1]=rad[t2];
}
int main()
{
  ifstream si;
  si.open("disjoint.in");
  ofstream so;
  so.open("disjoint.out");
  int n,m;
  si>>n>>m;
  int a,b,c,i;
  for(i=1;i<=n;++i)
  {
    rad[i]=i;
  }
  for(i=0;i<m;++i)
  {
    si>>a>>b>>c;

    if(a==1)
      uneste(b,c);
    else
    {
      if(query(b,c))
       so<<"DA"<<'\n';
      else
       so<<"NU"<<'\n';
    }
  }
  si.close();
  so.close();
  return 0;
}