function frameEdges=chooseFrameEdges(edges)
% Вибір ребер, необхідних для побудови ієрархічного дерева
% (Mantegna R. Hierarchical structure of correlations in a set of stock prices)
% Вхід:
%    edges      - вектор відсортованих по зростанню відстаней (1) із
%                    номерами вершин (2 та 3 стовпчики)
% Вихід:
%    frameEdges - набір ребер, необхідних для побудови дерева

% визначимо кількість вершин : x(x-1)/2=m -> x=(-b+sqrt(1+4*a))/2
[m,n]=size(edges);
v=floor((1+sqrt(1+4*2*m))/2);

% вектор вершин для хешування
vertexes=zeros(1,v);
% масив, куди записуватимуться взяті ребра
frameEdges=zeros(v-1,3);
% перше ребро записуємо по замовчуванню
frameEdges(1,:)=edges(1,:);
% запам"ятовуємо номера використаних вершин - це перша група
vertexes(frameEdges(1,2))=1;
vertexes(frameEdges(1,3))=1;
% поки що одна група
numberOfGroups=1;
% індекс наступного записуваного ребра
index=2;
for i=2:m
    % якщо ще не зустрічалась перша вершина (звідки виходить ребро)
    if ~vertexes(edges(i,2))
        % і не зустрічалась друга вершина (куди входить ребро)
        if ~vertexes(edges(i,3))
            % це буде нова група - наступна за номером
            numberOfGroups=numberOfGroups+1;
            % запам"ятовувємо вершини
            vertexes(edges(i,2))=numberOfGroups;
            vertexes(edges(i,3))=numberOfGroups;
            % запам"ятовуємо ребро
            frameEdges(index,:)=edges(i,:);
            index=index+1;
        else
            % друга вершина вже зустрічалась - запам"ятовуємо ребро, а
            % група цієї вершини - та ж, що й першої
            vertexes(edges(i,2))=vertexes(edges(i,3));
            frameEdges(index,:)=edges(i,:);
            index=index+1;
        end
    else
        % перша вершина зустрічалась, друга - ні
        if ~vertexes(edges(i,3))
            % запам"ятовуємо ребро, група вершини - та, що й першої
            vertexes(edges(i,3))=vertexes(edges(i,2));
            frameEdges(index,:)=edges(i,:);
            index=index+1;
        else
            % якщо зустрічались обидві вершини, але належать до різних груп
            % - об"єднуємо групи (перенумеровуючи вершини першої групи) і
            % додаємо ребро (для відображення об"єднуючої прямої
            if vertexes(edges(i,2))~=vertexes(edges(i,3))
                oldGroup=vertexes(edges(i,2));
                newGroup=vertexes(edges(i,3));
                for j=1:v
                    if vertexes(j)==oldGroup
                        vertexes(j)=newGroup;
                    end
                end
                frameEdges(index,:)=edges(i,:);
                index=index+1;
            end
        end
    end
end
% у матриці frameEdges знаходяться потрібні вершини