Mai intai trebuie sa te autentifici.
Cod sursa(job #1332445)
Utilizator | Data | 2 februarie 2015 00:03:28 | |
---|---|---|---|
Problema | Paduri de multimi disjuncte | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.43 kb |
#include <iostream>
#include <cstdio>
using namespace std;
int h[100005],tata[100005],n,m;
void unionn(int x, int y)
{
///unesc multimea cu rang mai mic de cea cu rang mai mare
if (h[x] > h[y])
tata[y] = x;
else tata[x] = y;
if (h[x] == h[y]) h[y]++;
}
int find(int x)
{
int r;
r=x;
///determin radacina arborelui
while (tata[r])
r=tata[r];
///comprim drumul de la x la r
int y=x;
while(y!=r)
{
int t=tata[y];
tata[y]=r;
y=t;
}
return r;
}
int main()
{
freopen("disjoint.in", "r", stdin);
freopen("disjoint.out", "w", stdout);
scanf("%d%d",&n,&m);
//initial fiecare nod pointeaza catre el insusi iar rangul fiecarui arbore este 1
for (int i = 1; i <= n; i++)
{
//tata[i] = i;
tata[i] = 0;
h[i] = 1;
}
for (int i = 1; i <= m; i++)
{
int cod,x,y;
scanf("%d%d%d",&cod,&x,&y);
if (cod == 2)
//verific daca radacina arborilor in care se afla x respectiv y este egala
if (find(x) == find(y)) printf("DA\n");
else printf("NU\n");
else //unesc radacinile arborilor corespunzatori multimilor nodurilor x respectiv y
{
if (find(x) != find(y))
unionn(find(x), find(y));
}
}
return 0;
}