// File: /workspace/github_c_makefile_star2_O0/trumabrat[P]GrandProjet/Graphe.c
// Function: chaine_arborescence
ListeEntier chaine_arborescence(Graphe* g, int u, int v){
    // Dans chaque iteration, on prend le sommet a la tete de la file
    // et enfile les sommets adjacent mais non visite
    // on continue cette boucle jusqu'a ce qu'on touche le sommet v

    // securisation
    assert(g);
    assert(u-1 < g->nbsom && v-1 < g->nbsom);
    if(u == v) return 0;

    int sommet_en_cours, a_enfiler;
    Cellule_arete* cell_arete;

    // on cree une table pour l'arborescence
    // qui stocke le sommet pere de chaque sommet
    int pere[g->nbsom];
    for (int i = 0; i < g->nbsom; i++)
    {
        pere[i] = -1;
    }

    // on cree une autre table pour stocker les distances entre u et les sommets
    int distance[g->nbsom];
    for (int i = 0; i < g->nbsom; i++)
    {
        distance[i] = g->nbsom + 1;
    }
    distance[u-1] = 0;

    // on cree une autre table pour stocker l'etat de visite
    // un sommet peut etre 
    //  non visite
    //  ouvert (certains de ses descendant ne sont pas encore visites) 
    //  ferme (tous ses descendant sont visites)
    etat_visite visite[g->nbsom];
    for (int i = 0; i < g->nbsom; i++)
    {
        visite[i] = non_visite;
    }
    visite[u-1] = ouvert;
    
    // on cree un file pour les sommets a visiter
    S_file* file = calloc(1, sizeof(S_file));
    Init_file(file);
    enfile(file, u);

    // on fait un parcourt en largeur jusqu'a ce que la file est vide
    while(!estFileVide(file)){

        // on prend la tete de la file et parcourt sa liste de voisins
        // et enfile les sommets prochains
        sommet_en_cours = defile(file);
        cell_arete = g->T_som[sommet_en_cours-1]->L_voisin;
        while(cell_arete){
            // on teste le numero de sommet a enfiler
            // a_enfiler = cell_arete->a->u == sommet_en_cours ? v : u;
            if(cell_arete->a->u == sommet_en_cours) 
                 a_enfiler = cell_arete->a->v;
            else a_enfiler = cell_arete->a->u;
            
            // si deja visite, on ne prend pas, sinon on le prend et calcule sa distance
            //  et marque son status comme ouvert(en train de visiter)
            //  et memorise son ancetre
            if(visite[a_enfiler-1] == non_visite){
                visite[a_enfiler-1] = ouvert;
                distance[a_enfiler-1] = distance[sommet_en_cours-1]+1;
                pere[a_enfiler-1] = sommet_en_cours;
                enfile(file, a_enfiler);
            }
            cell_arete = cell_arete->suiv;
        }
        visite[sommet_en_cours-1] = ferme;
    }

    // creation et initialisation d'une liste a renvoyer
    ListeEntier chaine_parcourt;
    Init_Liste(&chaine_parcourt);
    
    // le cas ou sommets u et v ne sont pas connexe
    if(pere[v-1] == -1){
        liberer_file(file);
        return chaine_parcourt;
    }

    // traitement pour la liste de parcourt
    // on trouve le pere successivement a partir de v, jusqu'a u
    // ensuite on le stoke dans la liste (il y a une renversement)
    
    sommet_en_cours = v;
    while(sommet_en_cours != u){
        ajoute_en_tete(&chaine_parcourt, sommet_en_cours);
        sommet_en_cours = pere[sommet_en_cours-1];
    }
    ajoute_en_tete(&chaine_parcourt, sommet_en_cours); // on ajoute u

    // liberer memoire
    liberer_file(file);

    return chaine_parcourt;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x90, %rsp
movq %rdi, -0x10(%rbp)
movl %esi, -0x14(%rbp)
movl %edx, -0x18(%rbp)
cmpq $0x0, -0x10(%rbp)
je 0x196e
jmp 0x198d
leaq 0x36e7(%rip), %rdi      # 0x505c
leaq 0x36b9(%rip), %rsi      # 0x5035
movl $0xbe, %edx
leaq 0x371f(%rip), %rcx      # 0x50a7
callq 0x1090
movl -0x14(%rbp), %eax
subl $0x1, %eax
movq -0x10(%rbp), %rcx
cmpl (%rcx), %eax
jge 0x19ab
movl -0x18(%rbp), %eax
subl $0x1, %eax
movq -0x10(%rbp), %rcx
cmpl (%rcx), %eax
jge 0x19ab
jmp 0x19ca
leaq 0x3729(%rip), %rdi      # 0x50db
leaq 0x367c(%rip), %rsi      # 0x5035
movl $0xbf, %edx
leaq 0x36e2(%rip), %rcx      # 0x50a7
callq 0x1090
movl -0x14(%rbp), %eax
cmpl -0x18(%rbp), %eax
jne 0x19df
movq $0x0, -0x8(%rbp)
jmp 0x1cdb
movq -0x10(%rbp), %rax
movl (%rax), %eax
movq %rsp, %rcx
movq %rcx, -0x30(%rbp)
leaq 0xf(,%rax,4), %rdx
andq $-0x10, %rdx
movq %rsp, %rcx
subq %rdx, %rcx
movq %rcx, -0x80(%rbp)
movq %rcx, %rsp
movq %rax, -0x38(%rbp)
movl $0x0, -0x3c(%rbp)
movl -0x3c(%rbp), %eax
movq -0x10(%rbp), %rcx
cmpl (%rcx), %eax
jge 0x1a35
movq -0x80(%rbp), %rax
movslq -0x3c(%rbp), %rcx
movl $0xffffffff, (%rax,%rcx,4) # imm = 0xFFFFFFFF
movl -0x3c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x3c(%rbp)
jmp 0x1a10
movq -0x10(%rbp), %rax
movl (%rax), %eax
leaq 0xf(,%rax,4), %rdx
andq $-0x10, %rdx
movq %rsp, %rcx
subq %rdx, %rcx
movq %rcx, -0x88(%rbp)
movq %rcx, %rsp
movq %rax, -0x48(%rbp)
movl $0x0, -0x4c(%rbp)
movl -0x4c(%rbp), %eax
movq -0x10(%rbp), %rcx
cmpl (%rcx), %eax
jge 0x1a8f
movq -0x88(%rbp), %rax
movq -0x10(%rbp), %rcx
movl (%rcx), %edx
addl $0x1, %edx
movslq -0x4c(%rbp), %rcx
movl %edx, (%rax,%rcx,4)
movl -0x4c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x4c(%rbp)
jmp 0x1a62
movq -0x88(%rbp), %rax
movl -0x14(%rbp), %ecx
decl %ecx
movslq %ecx, %rcx
movl $0x0, (%rax,%rcx,4)
movq -0x10(%rbp), %rax
movl (%rax), %eax
leaq 0xf(,%rax,4), %rdx
andq $-0x10, %rdx
movq %rsp, %rcx
subq %rdx, %rcx
movq %rcx, -0x90(%rbp)
movq %rcx, %rsp
movq %rax, -0x58(%rbp)
movl $0x0, -0x5c(%rbp)
movl -0x5c(%rbp), %eax
movq -0x10(%rbp), %rcx
cmpl (%rcx), %eax
jge 0x1afa
movq -0x90(%rbp), %rax
movslq -0x5c(%rbp), %rcx
movl $0x0, (%rax,%rcx,4)
movl -0x5c(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x5c(%rbp)
jmp 0x1ad2
movq -0x90(%rbp), %rax
movl -0x14(%rbp), %ecx
subl $0x1, %ecx
movslq %ecx, %rcx
movl $0x1, (%rax,%rcx,4)
movl $0x1, %edi
movl $0x10, %esi
callq 0x10a0
movq %rax, -0x68(%rbp)
movq -0x68(%rbp), %rdi
callq 0x4530
movq -0x68(%rbp), %rdi
movl -0x14(%rbp), %esi
callq 0x4580
movq -0x68(%rbp), %rdi
callq 0x4560
cmpl $0x0, %eax
setne %al
xorb $-0x1, %al
testb $0x1, %al
jne 0x1b53
jmp 0x1c4b
movq -0x68(%rbp), %rdi
callq 0x45f0
movl %eax, -0x1c(%rbp)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movl -0x1c(%rbp), %ecx
subl $0x1, %ecx
movslq %ecx, %rcx
movq (%rax,%rcx,8), %rax
movq 0x18(%rax), %rax
movq %rax, -0x28(%rbp)
cmpq $0x0, -0x28(%rbp)
je 0x1c2f
movq -0x28(%rbp), %rax
movq (%rax), %rax
movl (%rax), %eax
cmpl -0x1c(%rbp), %eax
jne 0x1ba4
movq -0x28(%rbp), %rax
movq (%rax), %rax
movl 0x4(%rax), %eax
movl %eax, -0x20(%rbp)
jmp 0x1bb0
movq -0x28(%rbp), %rax
movq (%rax), %rax
movl (%rax), %eax
movl %eax, -0x20(%rbp)
movq -0x90(%rbp), %rax
movl -0x20(%rbp), %ecx
subl $0x1, %ecx
movslq %ecx, %rcx
cmpl $0x0, (%rax,%rcx,4)
jne 0x1c1e
movq -0x80(%rbp), %rax
movq -0x88(%rbp), %rcx
movq -0x90(%rbp), %rdx
movl -0x20(%rbp), %esi
subl $0x1, %esi
movslq %esi, %rsi
movl $0x1, (%rdx,%rsi,4)
movl -0x1c(%rbp), %edx
subl $0x1, %edx
movslq %edx, %rdx
movl (%rcx,%rdx,4), %esi
addl $0x1, %esi
movl -0x20(%rbp), %edx
subl $0x1, %edx
movslq %edx, %rdx
movl %esi, (%rcx,%rdx,4)
movl -0x1c(%rbp), %edx
movl -0x20(%rbp), %ecx
subl $0x1, %ecx
movslq %ecx, %rcx
movl %edx, (%rax,%rcx,4)
movq -0x68(%rbp), %rdi
movl -0x20(%rbp), %esi
callq 0x4580
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0x1b7c
movq -0x90(%rbp), %rax
movl -0x1c(%rbp), %ecx
subl $0x1, %ecx
movslq %ecx, %rcx
movl $0x2, (%rax,%rcx,4)
jmp 0x1b39
leaq -0x70(%rbp), %rdi
callq 0x46a0
movq -0x80(%rbp), %rax
movl -0x18(%rbp), %ecx
subl $0x1, %ecx
movslq %ecx, %rcx
cmpl $-0x1, (%rax,%rcx,4)
jne 0x1c81
movq -0x68(%rbp), %rdi
callq 0x4660
movq -0x70(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x74(%rbp)
jmp 0x1cd4
movl -0x18(%rbp), %eax
movl %eax, -0x1c(%rbp)
movl -0x1c(%rbp), %eax
cmpl -0x14(%rbp), %eax
je 0x1cb0
movl -0x1c(%rbp), %esi
leaq -0x70(%rbp), %rdi
callq 0x46e0
movq -0x80(%rbp), %rax
movl -0x1c(%rbp), %ecx
subl $0x1, %ecx
movslq %ecx, %rcx
movl (%rax,%rcx,4), %eax
movl %eax, -0x1c(%rbp)
jmp 0x1c87
movl -0x1c(%rbp), %esi
leaq -0x70(%rbp), %rdi
callq 0x46e0
movq -0x68(%rbp), %rdi
callq 0x4660
movq -0x70(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x74(%rbp)
movq -0x30(%rbp), %rax
movq %rax, %rsp
movq -0x8(%rbp), %rax
movq %rbp, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)