Cod sursa(job #1885989)

Utilizator andreimdvMoldovan Andrei andreimdv Data 20 februarie 2017 16:22:54
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
using namespace std;


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


int n,m,i,tip,v[100010],parenta,parentb,a,b;

int Find(int x) //nu este un find simplu. Acesta si reduce adancimea unei paduri astfel ca uneste toate nodurile prin care trece de radacina
{
    if(v[x]<0)
    {
        return x;
    }
    else
    return v[x]=Find(v[x]);
}


int main()
{
    fin>>n>>m;
    for(i=1;i<=n;++i)
    v[i]=-1; // la inceput fiecare nod este radacina. Radacina se noteaza cu -(numarul de elemente)

    for(i=1;i<=m;++i)
    {
        fin>>tip>>a>>b;
        if(tip==1)
        {
            parenta=Find(a);
            parentb=Find(b);
            if(v[parenta]>v[parentb])
            {
                v[parenta]=parentb;
            }
            else
            {
                if(v[parenta]<v[parentb])
                v[parentb]=parenta;
                else // inaltimi egale
                {
                    v[parenta] = parentb;
                    v[parentb]--;
                }
            }
        }
        else
        {
            parenta=Find(a);
            parentb=Find(b);
            if(parenta==parentb)
            {
                fout<<"DA\n";
            }
            else
            {
                fout<<"NU\n";
            }
        }
    }

    return 0;
}