Cod sursa(job #2460934)

Utilizator stefan1anubystefan popa stefan1anuby Data 24 septembrie 2019 18:24:46
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>

using namespace std;
ifstream cin("disjoint.in");
ofstream cout("disjoint.out");
#define NMAX 100020
int TT[NMAX], RG[NMAX];
int n, m;

int Find(int x)
{
	int R, y;

	//merg in sus pe arbore pana gasesc un nod care pointeaza catre el insusi
	for (R = x; TT[R] != R; R = TT[R]);

	//aplic compresia drumurilor
	for (; TT[x] != x;)
	{
		y = TT[x];
		TT[x] = R;
		x = y;
	}
	return R;
}

void Unite(int x, int y)
{
	//unesc multimea cu rang mai mic de cea cu rang mai mare
	if (RG[x] > RG[y])
		TT[y] = x;
			else TT[x] = y;

	//in caz ca rangurile erau egale atunci cresc rangul noii multimi cu 1
	if (RG[x] == RG[y]) RG[y]++;
}
int main()
{
    int i,t,x,y,m;
    cin>>n>>m;
    for(i=1; i<=n; i++)
    {
        RG[i]=1;
        TT[i]=i;
    }
    for(i=1; i<=m; i++)
    {
        cin>>t>>x>>y;
        if(t==2)
        {
            if(Find(x)==Find(y))
                cout<<"DA";
            else
                cout<<"NU";
            cout<<endl;
        }
        else
        {

            if (Find(x) == Find(y))
            {
                return 0;
            }
            Unite(Find(x),Find(y));
        }
    }
    return 0;
}