Cod sursa(job #1478089)

Utilizator justsomedudePalade Thomas-Emanuel justsomedude Data 27 august 2015 19:02:20
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include<iostream>
#include<fstream>

using namespace std;

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

int t[100005],c[100005],n,m;

int Find(int x)
{
  int y,z;
  y=x;
  while (t[x]!=0)
    x=t[x];

  while (t[y]!=x) /// n-am ajuns pana la radacina, le legam pe toate de radacina ca sa COMPLEXITATE 0(1)
  {
    z=t[y];
    t[y]=x; /// setam radacina la fiecare din ele
    y=z;
  }
  
  return x;
}

void Union (int x, int y)
{
  if (c[x] > c[y])
   {
      c[x]+=c[y];
      c[y]=0;
      t[y]=x;
   }

  else /// c[y] > c[x]
   {
      c[y]+=c[x];
      c[x]=0;
      t[x]=y;
   }  
}


void CitescRezolv()
{
  int i,cod,x,y;

  for (i=1; i<=n; i++)
     {   
         t[i]=0;
         c[i]=1;
     }

  fin>>n>>m;
  for (i=1; i<=m; i++)
{ 
  fin>>cod>>x>>y;
  
  if (cod == 1)
     Union(x,y);

  else
    { x=Find(x);  y=Find(y);
      if (x==y) fout<<"DA\n";
      else      fout<<"NU\n";  
    }
}
}
int main ()
{
 CitescRezolv();
 fin.close();
 fout.close();
 return 0;
}