Cod sursa(job #1524751)

Utilizator lolmanDomuta Dariu lolman Data 14 noiembrie 2015 13:35:12
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <fstream>
using namespace std;

int tata[100001], fii[100001],x,y,i,m,n,cod;

int radacina(int nod)            // cauta radacina unui arbore aka. ia un nod si merge de la tata la tata pana cand intalneste
    {                            // nodul care il are ca tata pe el insusi
        if (tata[nod]==nod)
            return nod;
        return radacina (tata[nod]);
    }

void uneste (int nod1, int nod2)
      {
          int rad1 = radacina (nod1);
          int rad2 = radacina (nod2);

          if (rad1==rad2) return;

          if (fii[rad1]>=fii[rad2])
                {
                   fii[rad1] += fii[rad2];
                   tata[rad2]=rad1;
                }
                       else
                         {
                              fii[rad2]+=fii[rad1];
                              tata[rad1]=rad2;
                         }
      }

int radcomuna(int nod1, int nod2)
   {
       if ( radacina(nod1)==radacina(nod2) ) return 1;
                                       else return 0;
   }
int main()
{
    ifstream f("disjoint.in");
    ofstream g("disjoint.out");

    f>>n>>m;
    for (i=1;i<=n;i++)
    {
        tata[i]=i; // initial toate nodurile sunt separate, existand n componente conexe. aka Fiecare nod este propriul sau tata.
        fii[i]=1; // la numarul fiilor unui nod se adauga si nodul tata
    }
    for(i=1;i<=m;i++)
    {
        f>>cod>>x>>y;
        if (cod==1) uneste(x,y);
        if (cod==2)
             {
                 if (radcomuna(x,y)==1) g<<"DA"<<'\n';
                          else g<<"NU"<<'\n';
             }
    }

    return 0;
}