Cod sursa(job #1875269)

Utilizator enedumitruene dumitru enedumitru Data 10 februarie 2017 21:55:57
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#define NMAX 100020
using namespace std;
ifstream f("disjoint.in"); ofstream g("disjoint.out");
int N,M,TT[NMAX],RG[NMAX];
int find(int x)
{   int R,y;
    for(R=x; TT[R]!=R; R=TT[R]);//merg in sus pe arbore pana gasesc un nod care pointeaza catre el insusi
    for(;TT[x]!=x;) //aplic compresia drumurilor
        {y=TT[x]; TT[x]=R; x=y;}
    return R;
}
void unite(int x, int y)
{   if(RG[x]>RG[y]) TT[y]=x; else TT[x]=y; //unesc multimea cu rang mai mic de cea cu rang mai mare
    if (RG[x]==RG[y]) RG[y]++; //in caz ca rangurile erau egale atunci cresc rangul noii multimi cu 1
}
int main()
{   f>>N>>M;
    for(int i=1;i<=N;i++)//initial fiecare nod pointeaza catre el insusi iar rangul fiecarui arbore este 1
        {TT[i]=i; RG[i] = 1;}
    for(int cd,x,y,i=1;i<=M;i++)
    {   f>>cd>>x>>y;
        if(cd==2)//verific daca radacina arborilor in care se afla x respectiv y este egala
            if(find(x)==find(y)) g<<"DA\n"; else  g<<"NU\n";
        else unite(find(x),find(y));//unesc radacinile arborilor corespunzatori multimilor nodurilor x respectiv y
    }
    g.close(); return 0;
}