Cod sursa(job #2736419)

Utilizator foodinatorfoodinator foodinator Data 3 aprilie 2021 14:21:55
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <iostream>
#include <fstream>
using namespace std;
int n,m,i,t[100005],c,a,b,t1,t2,r[100005];
ifstream in("disjoint.in");
ofstream out("disjoint.out");
int tata(int x)
{
    int R, y;

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

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

void unire(int t1, int t2)
{
    if (r[t1]>r[t2])
        t[t2]=t1;
    else t[t1]=t[t2];
    if (r[t1]==r[t2]) r[t2]++;
}
int main()
{
    in>>n>>m;
    for (i=1;i<=n;i++)
        t[i]=i;
    for (i=1;i<=m;i++)
    {
        in>>c;
        if (c==1)
        {
            in>>a>>b;
            t1=tata(a);
            t2=tata(b);
            unire(t1,t2);
        }
        else
        {
            in>>a>>b;
            t1=tata(a);
            t2=tata(b);
            if (t1==t2) out<<"DA"<<endl;
            else out<<"NU"<<endl;
        }
    }
}