2016-05-25 9 views
1

Dies ist ein Problem, das ich von meiner Klasse habe (ich versichere Ihnen, es ist keine Hausaufgabe). Ich denke immer noch darüber nach. Sie erhalten eine Grafik mit höchstens 25 Knoten und 25 Kanten. Zusätzlich wird jeder Knoten einen Grad von höchstens 3 haben. Die Aufgabe besteht darin, den längsten Pfad in diesem Graphen zu finden. Sie erhalten jedoch nicht nur 1 Grafik, sondern 15.000 Grafiken, und Sie müssen den längsten Pfad in allen von ihnen in 1 Sekunde finden. Könnte mir bitte jemand eine Lösung (oder noch besser, nur einen Hinweis) zu diesem Problem geben? Vielen Dank!Längster Pfad in kleiner Grafik mit kleinem Grad

Info:
- Knoten können erneut besucht werden, die einzigen Einschränkungen sind die Kanten.
- Die Graphen sind durch die Kanten gegeben. So gibt die erste Zeile an, wie viele Knoten und Kanten es gibt, und die Zeilen danach stellen die Kanten dar, jede Kante durch ein Paar Ganzzahlen.
- Die Kanten sind nicht gewichtet.
- Die einzige Antwort ist die Länge des Pfades, nicht der Pfad selbst.
- Dies könnte wichtig sein: Der Graph ist nicht notwendigerweise verbunden.

+2

Was sind die Einschränkungen für den längsten Pfad? Knoten können (nicht) erneut besucht werden? Ich nehme an, Kanten können nicht neu besichtigt werden? – trincot

+0

Da es eine Zeitbeschränkung gibt, muss ich fragen, wie Sie die Eingabe lesen werden? Wurde das Format angegeben? –

+0

66 Mikrosekunden pro Diagramm (Eingabe, Berechnung, Ausgabe). Ich bezweifle, dass es möglich ist –

Antwort

1

Nachdem ich sah, dass "Knoten können wieder besucht werden", erkannte ich, dass dies in gewisser Weise eine Trickfrage ist. Um diese scheinbar unglaublichen Zeitbeschränkungen zu erfüllen, brauchen Sie hier eigentlich keinen Algorithmus zur Konstruktion eines solchen Pfades (normalerweise trail, BTW, wenn Vertices wiederverwendet werden können), sondern für jede verbundene Komponente des Graphen. eine Möglichkeit, schnell zu erkennen, ob alle oder fast alle Kanten in dieser Komponente in einer einzelnen Spur enthalten sein können.

Also hier ist mein Tipp: Wussten Sie, dass es in Königsberg sieben Brücken gibt? ;-)

Das mag kryptisch erscheinen, aber ich denke, einige schnelle Suche wird Sie in die richtige Richtung weisen, und Sie werden bald einen Weg finden, um schnell zu erkennen, ob alle Kanten in einer Komponente bilden können gleiche Spur. (Sie müssen mehr darüber nachdenken, wie viele Kanten enthalten sein können, wenn die Antwort auf die obige Frage "Nein" lautet.)

+2

Haben Sie eine gute Annäherung an den "Wie viele Kanten können enthalten sein, wenn es keinen Eulerschen Pfad gibt"? Auf den ersten Blick fühlt es sich an, als wäre dieser Teil noch NP-vollständig? –

+0

@PeterdeRivaz: Sehr gute Frage, ich hätte bei diesem Teil nicht handwaved sein sollen. Laut http://kam.mff.cuni.cz/conferences/wg2011/files/slides/slides.pdf ist das Problem, die kleinste Anzahl von Kanten zu löschen, um einen Graph Eulerian zu machen, tatsächlich NP-schwer (d. H. Zu stellen Sie sicher, dass der Graph einen Euler * -Zyklus * hat, aber sicherzustellen, dass er einen Euler * -Pfad * hat, wie hier, ist nicht einfacher, da ein Algorithmus für Letzteres in ein O (| E |) - langsameres umgewandelt werden könnte Ersteres, indem du einfach jede Kante löschst, eine EP erstellst und dann die Kante wieder hinzufügst). –

+0

@PeterdeRivaz: Interessanterweise kann das Problem, alle Scheitelpunkte gradlinig mit einer minimalen Anzahl von Kantenlöschungen zu machen *, in Poly-Zeit gelöst werden - siehe Folien 10 und 11 für mehr (aber nicht zu viele!) Details.Was das Problem schwer macht, scheint die Einschränkung zu sein, dass der resultierende Graph immer noch verbunden ist. –