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

function cycle = fleury(G)
% rend un cycle eulerien dans G, algo de FLEURY
% On travaille avec les indices courants,
% mais on gere un vecteur de correspondance VC
% ex : suppression sommet 4 dans G d'ordre 6 =>
% un graphe reduit d'ordre 5 avec VC = [ 1 2 3 5 6 ]
% puis suppression sommet 2 => VC = [ 1 3 5 6 ]
if(euler(G))
    N = size(G,1);
    x = 1;
    cycle = [x];
    DI = zeros(1,N);
    DI2 = DI;
    while((size(G,1) ~= 0) && (size(voisin(G,x),2) ~= 0))
        L = voisin(G,x)
        B = L;
        i = 1;
        A = L+DI(L);
        do
            G2 = supprimer_arete(G,x,L(i));
            L
            if(size(L,2)>1)
                if(isole(G2,L(i)))
                    i = i+1;
                    G2 = supprimer_arete(G,x,L(i));
                end
            end
            if(isole(G2,x))
                G2 = supprimer_sommet(G2,x);
                DI = miseajourind(DI,x)
                DI2 = miseajourind2(DI2,x);
                B = L-DI2(L);
            endif
            i = i+1;
        until connexe(G2)
        G = G2;
        cycle = [cycle,A(i-1)]
        x = B(i-1);
    end
end
end
