// File: /workspace/github_c_makefile_star2_O2/trumabrat[P]GrandProjet/Graphe.c
// Function: plus_petit_chemin
int plus_petit_chemin(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 <= g->nbsom && v <= g->nbsom);
    if(u == v) return 0;

    int sommet_en_cours, a_enfiler;
    Cellule_arete* cell_arete;

    // 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] = 0;
    }
    
    // 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 qu'on rencontre le sommet v
    while(distance[v-1] == 0){

        // si on a pas visite le sommet v et la file est deja vide
        // c'est parce que u et v n'est pas connexe
        if(estFileVide(file)){
            liberer_file(file);
            return -1;
        }

        // 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 note sa distance
            if(distance[a_enfiler-1] == 0){
                enfile(file, a_enfiler);

                // Si on a note deja une distance plus petite, on la garde
                //   sinon on note la distance
                if(distance[a_enfiler-1] == 0 || (distance[sommet_en_cours-1]+1 < distance[a_enfiler-1])){
                    distance[a_enfiler-1] = distance[sommet_en_cours-1]+1;
                }
            }
            cell_arete = cell_arete->suiv;
        }
    }
    liberer_file(file);

    return distance[v-1];
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x28, %rsp
testq %rdi, %rdi
je 0x165e
movl %esi, %r12d
movl (%rdi), %eax
cmpl %esi, %eax
jl 0x1677
movl %edx, %r15d
cmpl %edx, %eax
jl 0x1677
xorl %r13d, %r13d
cmpl %r15d, %r12d
je 0x164c
movq %rsp, -0x38(%rbp)
movq %rsp, %rbx
leaq 0xf(,%rax,4), %rax
andq $-0x10, %rax
subq %rax, %rbx
movq %rbx, %rsp
movl (%rdi), %eax
xorl %ecx, %ecx
testl %eax, %eax
cmovlel %ecx, %eax
cmpq %rcx, %rax
je 0x158f
andl $0x0, (%rbx,%rcx,4)
incq %rcx
jmp 0x1581
movq %rdi, -0x40(%rbp)
pushq $0x1
popq %rdi
pushq $0x10
popq %rsi
callq 0x10d0
movq %rax, %r14
movq %rax, %rdi
callq 0x2eb0
movq %r14, -0x30(%rbp)
movq %r14, %rdi
movl %r12d, %esi
callq 0x2ec1
movslq %r15d, %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
movl -0x4(%rbx,%rax,4), %r13d
testl %r13d, %r13d
movq -0x30(%rbp), %r14
jne 0x1640
movq %r14, %rdi
callq 0x2eb7
testl %eax, %eax
jne 0x163c
movq %r14, %rdi
callq 0x2ef7
movl %eax, %r15d
movq -0x40(%rbp), %rax
movq 0x8(%rax), %rax
movslq %r15d, %r13
movq -0x8(%rax,%r13,8), %r14
decq %r13
addq $0x18, %r14
movq (%r14), %r14
testq %r14, %r14
je 0x15bf
movq (%r14), %rcx
movl (%rcx), %eax
cmpl %r15d, %eax
jne 0x1614
movl 0x4(%rcx), %eax
movslq %eax, %r12
cmpl $0x0, -0x4(%rbx,%r12,4)
jne 0x1636
movq -0x30(%rbp), %rdi
movl %r12d, %esi
callq 0x2ec1
movl (%rbx,%r13,4), %eax
incl %eax
movl %eax, -0x4(%rbx,%r12,4)
addq $0x8, %r14
jmp 0x15ff
pushq $-0x1
popq %r13
movq %r14, %rdi
callq 0x2f1b
movq -0x38(%rbp), %rsp
movl %r13d, %eax
leaq -0x28(%rbp), %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
leaq 0x19f6(%rip), %rdi      # 0x305b
leaq 0x19c8(%rip), %rsi      # 0x3034
leaq 0x19ea(%rip), %rcx      # 0x305d
pushq $0x7b
jmp 0x168e
leaq 0x1a09(%rip), %rdi      # 0x3087
leaq 0x19af(%rip), %rsi      # 0x3034
leaq 0x19d1(%rip), %rcx      # 0x305d
pushq $0x7c
popq %rdx
callq 0x10b0