Pagini recente » Cod sursa (job #956491) | Cod sursa (job #312044) | Cod sursa (job #1581755) | Cod sursa (job #686960) | Cod sursa (job #716466)
Cod sursa(job #716466)
program paduri_multimi_disjuncte;
{Paduri de multimi disjuncte
Se dau N multimi de numere, initial fiecare multime i continand un singur
element, mai exact elementul i. Asupra acestor multimi se pot face 2 tipuri
de operatii, astfel:
--operatia de tipul 1: se dau doua numere naturale x si y, intre 1 si N.
Se cere sa reuneasca multimile in care se afla elementul x, respectiv
elementul y (se garanteaza ca x si y nu se vor afla in aceeasi multime)
--operatia de tipul 2: se dau doua numere naturale x si y, intre 1 si N.
Se cere sa afiseze DA daca cele 2 elemente se afla in aceeasi multime,
respectiv NU in caz contrar.
Date de intrare
Pe prima linie a fisierului de intrare disjoint.in se vor afla 2 numere,
N si M, reprezentand numarul de multimi, respectiv numarul de operatii
efectuate. Pe urmatoarele M linii se vor afla cate 3 numere, cod, x si y,
cod reprezentand tipul operatiei, iar x si y avand semnificatia din enunt.
Date de iesire
In fisierul de iesire disjoint.out se vor afisa mai multe linii, fiecare
linie continand DA sau NU, reprezentand raspunsul la interogarea
corespunzatoare din fisierul de intrare.}
var fi,fo:text;
bufin,bufout:array[1..1 shl 17]of char;
tata,h:array[1..100005] of longint;
cod,x,y,m,n,i:longint;
function find(x:longint):longint;
var r,y:longint;
begin
while tata[x]<>x do
x:=tata[x];
find:=x;
end;
procedure unite(x,y:longint);
begin
if h[x]>h[y] then tata[y]:=x
else tata[x]:=y;
if h[x]=h[y] then h[y]:=h[y]+1;
end;
begin
assign(fi,'disjoint.in'); reset(fi); settextbuf(fi,bufin);
assign(fo,'disjoint.out'); rewrite(fo); settextbuf(fo,bufout);
readln(Fi,n,m);
for i:=1 to n do
begin
tata[i]:=i; //initial, fiecare nod e propriul "tata"
h[i]:=1; //si inaltimea fiecarui arbore e 1
end;
for i:=1 to m do
begin
readln(fi,cod,x,y);
case cod of 1: unite(find(x), find(y));
2: if find(x)=find(y) then
writeln(fo,'DA')
else writeln(fo,'NU');
end;
end;
close(fi); close(fo);
end.