#include "bellman.h" /******************* fonction algoBellman ******* Lorsque l'on appelle cette fonction, on suppose que le graphe ne possède pas de circuit. Si cette condition n'est pas vérifiée, la fonction ne fonctionnera pas correctement. L'argument r indiqué en paramètre est le nom d'un sommet à partir duquel on cherche à calculer une arborescence de plus courts chemins. L'argument num contient au moment de l'appel une numérotation topologique, les numéros topologiques étant compris ici entre 0 et ordre - 1. On suppose qu'au moment de l'appel de la fonction, une allocation mémoire a déjà été faite pour les tableaux distance et antecedent. Il s'agit de deux tableaux pouvant contenir chacun "ordre" int. La fonction algoBellman remplit les tableaux distance et antecedent. À la fin de l'algorithme : - pour un sommet x non accessible à partir de r, distance[x] vaut INFINI (défini plus haut par un #define) et antecedent[x] vaut -1. - l'antecedent de r vaut -1. - pour un sommet x accessible à partir de r et autre que r, antecedent[x] est l'avant-dernier sommet dans un plus court chemin de r à x et distance[x] est la distance de r à x. */ void algoBellman(int depart) { int sommet; int numero; int sommetMin; int min; PERE * adrPere; int unPere; for (sommet = 0; sommet < ordre; sommet++) { antecedent[sommet] = -1; distance[sommet] = INFINI; } distance[depart] = 0; for (numero = num[depart] + 1; numero < ordre; numero++) { sommet = deNum[numero]; min = INFINI; adrPere = graphe[sommet]; while(adrPere != NULL) { unPere = adrPere->nomPere; if ((distance[unPere] != INFINI) && (distance[unPere] + adrPere->longueur < min)) { min = distance[unPere] + adrPere->longueur; sommetMin = unPere; } adrPere = adrPere->suivant; } if (min < INFINI) { distance[sommet] = min; antecedent[sommet] = sommetMin; } } free(deNum); /* Les deux instructions qui suivent ne sont utiles que pour la période de tests */ printf("Voici les antecedents trouves\n"); ecrireValeurs(antecedent); }