Cod sursa(job #2512542)

Utilizator sygAndreiIonitaIonita Andrei sygAndreiIonita Data 21 decembrie 2019 11:32:55
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include <fstream>

using namespace std;

int p[100001],h[100001];

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

void _init(int n)
{
  for (int i=1;i<=n;i++)
        p[i]=i,h[i]=1;
}

int _find(int x)
{
  int r=x;
  while (p[r]!=r)
        r=p[r];
  while (p[x]!=r)
  {
    int tmp=p[x];
    p[x]=r;
    x=tmp;
  }
  return r;
}

void _union(int x,int y)
{
  int radx,rady;
  radx=_find(x),rady=_find(y);
  if (h[radx]>h[rady])
    p[rady]=radx;
  else if (h[radx]<h[rady])
    p[radx]=rady;
  else
    p[radx]=rady,h[rady]++;
}

int main()
{
    int n,m,i,t,x,y;
    in>>n>>m;
    _init(n);
    for (i=1;i<=m;i++)
    {
      in>>t>>x>>y;
      if (t==1)
            _union(x,y);
      else
      {
        int radx=_find(x),rady=_find(y);
        if (radx!=rady)
            out<<"NU"<<'\n';
        else
            out<<"DA"<<'\n';
      }
    }
    return 0;
}