Cod sursa(job #2239470)

Utilizator Anastasia11Susciuc Anastasia Anastasia11 Data 10 septembrie 2018 21:06:23
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <fstream>
#define Nmax 100005

using namespace std;

string file="disjoint";

ifstream f( (file + ".in").c_str() );
ofstream g( (file + ".out").c_str() );

int cod, x, y;
int n, m;
int dd[Nmax], rg[Nmax];

int find(int x)
{
    int r=dd[x], y;
    while(r!=dd[r]) r=dd[r];
    //compresie
    while(dd[x]!=x)
    {
        y = dd[x];
        dd[x] = r;
        x = y;
    }

    return r;
}

void unite(int x, int y)
{
    if(rg[x] > rg[y]) dd[y]=x;
    else dd[x]=y;

    if(rg[x] == rg[y])
    rg[y]++;

}

int main()
{
    f >> n >> m;
    for ( int i = 1; i <= n; i ++ )
     dd[i]=i, rg[i]=1;

    while(m -- )
    {
     f >> cod >> x >> y;
     if (cod == 1)
      unite(x, y);
      else
      {
          if(find(x)==find(y)) g << "DA\n";
          else g << "NU\n";
      }
    }

    return 0;
}