Sie leicht Floyd-Warshall algorithm ändern können. (Wenn Sie mit der Graphentheorie überhaupt nicht vertraut sind, schlage ich vor, es auszuprobieren, beispielsweise eine Kopie von Introduction to Algorithms zu erhalten).
Traditionell starten Sie path[i][i] = 0
für jeden i
. Aber Sie können stattdessen von path[i][i] = INFINITY
starten. Es wirkt sich nicht auf den Algorithmus selbst aus, da diese Nullen sowieso nicht in der Berechnung verwendet wurden (da sich der Pfad path[i][j]
niemals für k == i
oder k == j
ändert).
Am Ende ist path[i][i]
die Länge der kürzeste Zyklus durch i
geht. Folglich müssen Sie min(path[i][i])
für alle i
finden. Und wenn Sie selbst (nicht nur seine Länge) Zyklus wollen, können Sie es tun, wie es normalerweise mit normalen Pfaden getan wird: durch Auswendiglernen k
während der Ausführung des Algorithmus.
Darüber hinaus können Sie auch Dijkstra's algorithm verwenden, um einen kürzesten Zyklus zu finden, der durch einen bestimmten Knoten geht. Wenn Sie diesen modifizierten Dijkstra für jeden Knoten ausführen, erhalten Sie das gleiche Ergebnis wie bei Floyd-Warshall. Und da jeder Dijkstra O(n^2)
ist, erhalten Sie die gleiche O(n^3)
Gesamtkomplexität.
Dies entspricht nicht den Anforderungen. In diesen Algorithmen bedeutet die kürzeste die am wenigsten gewichtete und nicht die kleinste Länge. z.B. wenn es zwei Zyklen wie 1,2,3 und dann 100,500 gibt; dann wird Zyklus 1 gewählt, aber was benötigt wird, ist Zyklus 2, da er die kürzeste Länge hat. Korrigiere mich, wenn ich falsch liege. –
@Manoj Zweites Problem ist eine Teilmenge der ersten. Ordnen Sie jeder Kante einfach Gewicht 1 zu und Sie erhalten den Pfad mit der kleinsten Anzahl an Kanten. Das eigentliche Problem (obwohl klein) ist, dass weder Dijkstra noch Floyd-Warshal einen kürzesten Weg vom Knoten zurück zu sich selbst finden. Sie müssen sie ein wenig zwicken. –
Danke..ich benutzte die modifizierte Version von Dijkstra und es funktionierte –