En pseudocode:
//INPUT: graph G = (V,E)
//OUTPUT: shortest cycle length
min_cycle(G)
min = ∞
for u in V
len = dij_cyc(G,u)
if min > len
min = len
return min
//INPUT: graph G and vertex s
//OUTPUT: minimum distance back to s
dij_cyc(G,s)
for u in V
dist(u) = ∞
//makequeue returns a priority queue of all V
H = makequeue(V) //using dist-values as keys with s First In
while !H.empty?
u = deletemin(H)
for all edges (u,v) in E
if dist(v) > dist(u) + l(u,v) then
dist(v) = dist(u) + l(u,v)
decreasekey(H,v)
return dist(s)
Cela va une années Dijkstra légèrement différentes sur chaque sommet. Le Dijkstras muté a quelques différences clés. Tout d'abord, toutes les distances initiales sont définies sur ∞, même le sommet de départ . Deuxièmement, le sommet de départ doit d'abord être mis dans la file d'attente pour que le résultat soit le premier, car ils ont tous la même priorité. Enfin, le Dijkstras muté renvoie la distance au nœud de départ. S'il n'y avait pas de retour au point de départ , la distance reste ∞. Le minimum de tous ces retours des Dijkstras mutés est le chemin le plus court. Puisque Dijkstras court au pire dans O (| V |^2) et que min_cycle court cette forme de Dijkstras | V | fois, le temps final pour trouver le cycle le plus court est O (| V |^3). Si min_cyc renvoie ∞ alors le graphe est acyclique.
Pour retourner le chemin réel du cycle le plus court, seules de légères modifications doivent être effectuées.
Il veut trouver le chemin le plus court qui visite tous les nœuds, et non le cycle le plus court qui ramène à l'original. Au moins, c'est ce que j'ai compris de la question. – jfclavette
Merci, édité ma réponse. – marcog
Il pourrait ne pas être tout à fait le problème de vendeur itinérant car il ne semble y avoir aucune restriction dans la question que les nœuds soient visités exactement une fois. Donc, ce problème ne nécessite pas que le graphique ait un cycle hamiltonien. – jfclavette