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

function [T w] = kruskal(G)
% T : matrice d'adjacence de l'arbre couvrant trouvé
% w : poids de l'arbre couvrant

T = zeros(size(G));

H = (G > 0);
naretes = sum(sum(H));

% On passe le poids des arêtes de poids nul à inf
H = G;
H(H == 0) = inf;

% Pour trouver un arbre couvrant, il faut au moins une composante connexe
% dans le graphe
if(isempty(tarjan(G)))
    return;
end

CC = zeros(size(G));
for i = 1 : size(G,1)
    CC(i,i) = 1;
end

for i = 1 : naretes
    [tmp, u] = min(H);
    [~, v] = min(tmp);
    u = u(v);
    if(~isequal(CC(u,:), CC(v,:)))
    % Si les deux composantes connexes sont différentes alors on les
    % fusionne
        CC(u, CC(v,:) == 1) = 1;
        cc = find(CC(u,:)==1);
        for j = 1 : length(cc)
            CC(cc(j), :) = CC(u,:);
        end
        T(u,v) = 1;
        T(v,u) = 1;
    end
    H(u,v) = inf;
    H(v,u) = inf;
end
w = sum(G(T == 1)) / 2;
end
