% GraphTook - 2007-2012 Glotin & Chouchane
% Dyni LSIS USTV - {glotin, mathieu.chouchane} @ univ-tln.fr

function [T w] = prim(G)

ordre = size(G,1);
H = (G > 0);
T = zeros(size(G));

parent = zeros(1, ordre);
cle = inf * ones(1, ordre);
visite = zeros(1, ordre);

% On choisit un sommet de depart au hasard, la racine
s = alea(ordre);
% cle(s) : poids minimal d'une arete reliant s un sommet de l'arbre     
cle(s) = 0;
% comme s est la racine de l'arbre, cle(s) = 0
visite(s) = 1;
% L'algorithme de Prim effectue n iterations, n etant le nombre de sommets
% du graphe
while(sum(visite) ~= ordre)
    [~, s] = min(cle);
    % On cherche l'arete de poids minimal et on la marque
    cle(s) = inf;
    visite(s) = 1;
    % Si s a un parent dans l'arbre on ajoute l'arete a l'arbre couvrant
    if(parent(s) ~= 0)
        T(s, parent(s)) = 1;
        T(parent(s), s) = 1;
    end
    v = voisin(H, s);
    % Mise à jour des vecteurs cle et parent
    for i = 1 : length(v)
        if(visite(v(i)) == 0 && G(s,v(i)) < cle(v(i)))
            parent(v(i)) = s;
            cle(v(i)) = G(s, v(i));
        end
    end
end

% Calcul du poids de l'arbre couvrant
w = sum(G(T == 1)) / 2;

end

function zs = alea(n)
aux=randperm(n);
zs=aux(1);
end

function V = voisin(G,s)
V = find(G(s,:) == 1);
end
