Pagini recente » Cod sursa (job #3260500) | Cod sursa (job #156704) | Cod sursa (job #2523855) | Cod sursa (job #1805082)
#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;
}