Какой алгоритм реализует приведенная ниже программа?
const nnn = 10000;type uk = ^ukk; ukk = record v: integer; next: uk; end;var head: array[1..nnn] of uk; a: array[1..nnn] of integer; ii,i,j,k,n: integer; q,p: uk; f: text;procedure dob(ii,jj: integer); {добавление ребра}var pp,qq: uk;begin new(qq); qq^.v:=jj; qq^.next:=nil; if head[ii]=nil then head[ii]:=qq {вставка первого} else begin {вставка остальных} pp:=head[ii]; while pp^.next<>nil do pp:=pp^.next; pp^.next:=qq; end;end;begin{------- считывание графа ------------} ... readln(f,n); {кол-во вершин в графе} while not eof(f) do begin read(f,i,j); if i<>j then begin dob(j,i); dob(i,j); end; end;{--------- инициация массива ---------} for i:=1 to n do begin head[i]:=nil; a[i]:=0; end;{------- основная часть -------------} k:=0; i:=1; repeat k:=k+1; a[i]:=k; p:=head[i]; while p<>nil do begin j:=p^.v; a[j]:=k; if (head[j]<>nil) and (i<>j) then begin q:=p; while q^.next<>nil do q:=q^.next; q^.next:=head[j]; head[j]:=nil; end; p:=p^.next; end; i:=i+1; while (head[i]=nil) and (i<=n) do i:=i+1; until i=n+1; for i:=1 to n do if a[i]=0 then k:=k+1; writeln(k); {выдача результата}end.