3. Algorithme de FORD

L’algorithme de Ford s ’applique aux réseaux qui ne comportent pas de cycles de longueur négative ; donc certains arcs peuvent présenter des longueurs négatives, mais pas trop...

On définit initialement la liste d’attente comme le sommet d’origine r.

A un instant intermédiaire, on inspecte un noeud i de la liste d’attente : pour tout arc a issu de ce noeud, on teste si LAMC(i) + 1a ≥ LAMC(Ea), auquel cas on ajoute Ea à la liste d’attente.

Dans tous les cas le sommet i est retiré de cette liste.

Appelant itération un ensemble d’opérations consistant à appliquer le traitement élémentaire décrit ci-dessus à tous les noeuds présents dans la liste d’attente à un instant donné, alors, si le réseau n’admet pas de circuit de longueur strictement négative, les valeurs finales des LAMC(i) sont obtenues en au plus message URL abarre.gif itérations.

La description formelle s’énonce ainsi, notant S la liste d’attente :

message URL ANNEXEALGO1.gif

Divers ajouts permettent de stocker d’autres informations que les longueurs minimales d’accès, ou de procéder aisément à la tenue de la liste.

Pour décrire les chemins d’accès, il suffit d’associer à chaque noeud i une variable P(i) contenant l’indice du noeud extrémité initiale de l’arc terminant le meilleur chemin entre r et i. Cette variable doit être mise à jour à chaque fois que i est introduit dans S. La considération successive des P(i), P(P(i)), ... indique l’ordre inverse des sommets sur le chemin de r à i.

Pour gérer la liste d’attente, il suffit d’associer à chaque noeud i une variable S(i) qui vaudra 0 si i ne figure pas dans la liste, ou j indice du successeur de i dans la liste quand i en fait partie (ou -1 si i est en fin de liste).

Deux variables supplémentaires TêteDeListe et FinDeListe visent respectivement les premier et dernier noeuds de la liste. L’ajout d’un sommet i à la liste, en position terminale (s’assurer d’abord que S(i)=0), s’opère en affectant i à S (FinDeListe), puis i à FinDeListe. Pour retirer un élément i du début de la liste, il suffit d’affecter S(TêteDeListe) à TêteDeListe et d’imposer S(i)=0. On sait que la liste est épuisée dès que la réponse à (TêteDeListe)-1?) est positive.