Suche nach längster Pfad in einem Graphen
Ich versuche mich zu lösen, ein Programm, wo ich die max Anzahl von Städten angeschlossen, die für eine gegebene Liste von Routen.
zB:
wenn die angegebene route ist [['1', '2'], ['2', '4'], ['1', '11'], ['4', '11']]
dann max Städten verbunden werden 4
Einschränkung ist, kann ich nicht besuchen, eine Stadt, die ich bereits besucht habe.
Brauche ich Ideen, wie in, wie Sie Fortschritte.
Für jetzt, Was ich nachgedacht habe ist, wenn ich könnte in der Lage sein, um ein Wörterbuch zu erstellen mit Städten wie ein Schlüssel und wie viele andere Städte seine verbunden als Wert, ich bekomme irgendwo in der Nähe der Lösung(hoffe ich).
zB: Mein Wörterbuch {'1': ['2', '11'], '4': ['11'], '2': ['4']}
für die oben angegebene Eingabe.
Ich will Hilfe für das weitere Vorgehen und Hinweise, wenn ich etwas fehlt.
- In Bezug auf die algorithmen, Sie können look into Tiefe-zuerst-Suche oder Breite-zuerst-Suche
- Danke. Ich ging durch die Seiten. Ich würde schätzen, viel mehr, wenn Sie mir helfen bei der Umsetzung oder einfach nur erläutern, wie es zu implementieren.
- Die längste-Wege-problem ist ein NP-hartes problem. Siehe en.m.wikipedia.org/wiki/Longest_path_problem. Sie möchten möglicherweise verwenden Sie eine Grafik-Bibliothek, oder verwenden Sie einen bekannten Algorithmus, um es zu lösen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie eine
defaultdict
, erstellen Sie Ihre "Grafik" aus der Liste der Kanten/Wege:Ausgabe:
Hinweis, dass ich die Kanten in beiden Richtungen, da Sie arbeiten mit einem ungerichteten Graphen. Also mit der Kante (a,b)
G[a]
gehörenb
undG[b]
gehörena
.Können Sie verwenden einen Algorithmus, wie Tiefe-zuerst-Suche oder Breite-zuerst-Suche zu entdecken, alle Pfade im Graphen.
In der folgende code, die ich verwendet, DFS:
Die Sie verwenden können, mit:
Ausgabe:
So ist der vollständige code, der mit dem letzten bit, die zeigt, dass der längste Pfad:
Ausgabe:
Hinweis, der "Ausgangspunkt" der Suche angegeben wird, indem Sie das zweite argument der
DFS
Funktion, in diesem Fall, es ist'1'
.Update: Wie bereits in den Kommentaren der obige code setzt Voraus, Sie haben einen Ausgangspunkt in mind (speziell der code verwendet die Knoten beschriftet
'1'
).Einer allgemeineren Methode, in dem Fall, dass Sie keine solchen Ausgangspunkt wäre, um die Suche durchzuführen, beginnend bei jeder Knoten, und nehmen Sie die insgesamt längste.
(Anmerkung: In Wirklichkeit, Sie könnte schlauer sein als diese)
Ändern der Zeile
zu
geben würde, Sie den längsten Pfad zwischen alle zwei Punkte.
(Das ist eine dumme Liste zu begreifen, aber es erlaubt mir, zu aktualisieren nur eine einzige Linie. Mehr klar, es ist äquivalent zu den folgenden:
oder
).
G[t].append(s)
aus dieser Schleife.DFS()
Funktion: Dieseen
Liste muss nicht geteilt werden, die unter unterschiedlichen rekursiven Aufrufe desDFS()
weil die Knoten, die besucht wurden, auf einem Pfad sollte keinen Einfluss auf die Konstruktion der anderen Weg (nämlich durch die Kündigung zu früh). Eine schnelle Lösung wäre die Zeile ändernpaths.extend(DFS(G, t, seen, t_path))
zupaths.extend(DFS(G, t, seen[:], t_path))
, die eine neue Kopie erstellen jedes mal.all_paths = DFS(G,'1')
geändert wurden, umDFS(G,'5')
(oder11
) und dann ein Pfad der Länge 5 gezeigt werden würde. Für den allgemeineren Fall zu ändern, dass die Linie um so etwas wieall_paths = [p for ps in [DFS(G, n) for n in set(G)] for p in ps]
funktionieren sollte.Hier ist mein code, der funktioniert für die Eingabe in dem Beispiel, aber wenn ich tweak die Eingabe ein wenig, der code schlägt fehl, geben Sie die richtige Anzahl von Städten angeschlossen.
Den Ausgang für die obige Eingabe ist
4
und ich bekomme4
aber Wenn die Eingabe geändert wird, so etwas wie dieses:['1#2','2#3','1#11','3#11','4#11','4#5','5#6','5#7','6#7','4#12','8#12','9#12','8#10','9#10',8#9]
Mein code scheitert.
Dank,
LearningNinja 😀