Frage

Bei einem Graph ungerichtet G = (V, E) und eine Menge von Knoten P. Ich brauche einen Zyklus (nicht der kürzeste Länge Zyklus), die diese Knoten zu finden? Wie kann ich diesen Zyklus finden?

War es hilfreich?

Lösung

Enthält Hamilton-Zyklus (für P = V), damit das Entscheidungsproblem (nur zu wissen, wenn es so etwas gibt) ist NP-vollständig. Also gibt es keinen effizienten Algorithmus, es sei denn P = NP.

Andere Tipps

würde ich wahrscheinlich starten Sie den Algorithmus der Gestaltung durch den ersten Knoten in P Auswahl (nennen wir es P [0]), dann eine Tiefe-zuerst von P Suche läuft [0], zur Kenntnis zu jeder Zeit P unter [0] ist wieder erreicht. Sie müssten den Weg zur Wieder Reichweite P genommen speichern [0] (oder zumindest, ob die anderen Knoten von P erreicht worden sind), so dass Sie wissen, dass jeder Zyklus Sie alle Knoten in P. finden enthält Laufzeit sollte das gleiche wie für Tiefensuche, die ich glaube, ist O (V + E).

Jemand kann mit einer besseren Lösung kommen und bestimmte Heuristik könnte Hilfe angewendet werden, aber das sollte Ihnen den Einstieg. (Zum Beispiel können Sie schließen Sie am Knoten von P mit den wenigstenen Kanten statt ab P [0]. Beginnen sollten)

Edit:

Eine weitere Sache, dachte ich an ... Wenn Sie einen anderen Knoten in P über Ihre Tiefensuche zu erreichen, gibt es keine Notwendigkeit für die DFS jemals zu „neu anfangen“ von Anfang an oder Pfade zu berücksichtigen, die nicht tun um diesen neu gefundenen Knoten. Diese Eigenschaft könnte helfen, Ihr Algorithmus schneller im Fall enden, wo kein solcher Zyklus vorhanden ist.

Weiter bearbeiten:

Sie nie die zuletzt etwas dagegen - wäre es nur, wenn es festgestellt werden kann, dass es keinen Knoten in P auf einem anderen Pfad zwischen P [0] und der Knoten in P erreicht, dass nicht eine andere Art und Weise erreicht werden kann, und wir nicht weiß, dass sicher würde die ganze DFS ohne zu tun.

Im Hinblick auf die Antwort über Hamilton-Zyklen, ich weiß nicht, wie die Zyklus-Erkennung in dem Problem bei der Hand ist NP-vollständig. Ja, wir würden die gesamten Graphen durchlaufen müssen (alle Ecken und Kanten) erreichbar vom Startpunkt, um zu bestimmen, ob ein Zyklus der Kriterien des Problems auf der Hand treffen existiert. Ferner müssten wir auf den in Kontakt mit einem zuvor besuchten Scheiteln, was der „Vorwärtspfad“ des Vertex wäre wissen, um zu bestimmen, ob ein Zyklus ist, die Kriterien zu erfüllen. Da wir über den kürzesten solchen Zyklus sie sich nicht, aber ich bin nicht sicher, wie wir unbedingt versuchen, einen Hamilton-Zyklus zu finden. Pflege zu erleuchten?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top