Cod sursa(job #1805082)

Utilizator mariusmagureanmagurean marius mariusmagurean Data 13 noiembrie 2016 14:13:30
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.29 kb
#include <fstream>
#define dim 100020
using namespace std;

//initial toate punctele se afla intr un arbore cu un singur element
//fiecare arbore va avea inaltimea 0
//padurile se vor reprezenta prin vectorul de tati t, iar r va retine inaltimea fiecarui arbore
//radacina va avea in vectorul de tati valoarea 0
//r[i]=0, inseamna ca i se afla intr un arbore si nu este radacina sau este radacina unui arbore format dintr un sg nod
//n -nr de noduri, m numarul de operatii de tip union find, union este codificata cu 1, find cu 2

int t[dim],r[dim],n,m;

void uniune(int x,int y)
{
    //aplica uniunea a doi arbori, dupa rang, adica arborele cu rang mai mic se uneste la arborele cu rang mai mare,
    //adica radacina arborelui mai mic va avea ascendent radacina arborelui mai mare
    //evident randul arborelui mai mare nu creste prin uniune, iar rangul radacinii arborelui mai mic va fi 0, fiind alipit
    //daca rangul este egal inseamna ca rangul noului arbore va fi cu 1 mai mult
    if(r[x]>r[y])
    {
        t[y]=x;
        r[y]=0;
    }
    else
        if(r[x]<r[y])
        {
            t[x]=y;
            r[x]=0;
        }
        else
        {
            t[y]=x;
            r[x]++;
            r[y]=0;
        }
}

int find(int x)
{
    int c=x;
    //caut radacina arborelui in care se afla x
    while(t[c]!=0)
        c=t[c];
    //cand se iese din while c va fi radacina arborelui in care se afla x
    //in continuare aplic compresia drumului, adica orice nod non radacina dintr un arbore va fi legat direct la radacina
    int y;
    while(t[x]!=0)
    {
        y=t[x];
        t[x]=c;
        x=y;
    }
    return c;
}

int main()
{
    int mod,x,y,r1,r2;
    ifstream fin("disjoint.in");
    ofstream fout("disjoint.out");
    fin>>n>>m;
    while(m>0)
    {
        fin>>mod>>x>>y;
        if(mod==1)
        {
            //unim arborii in care se afla x si y, doar daca nu au aceeasi radacina
            r1=find(x);
            r2=find(y);
            if(r1!=r2)
                uniune(r1,r2);
        }
        else
        {
            if(find(x)==find(y))
                fout<<"DA\n";
            else
                fout<<"NU\n";
        }
        m--;
    }
    fin.close();
    fout.close();
    return 0;
}