2017-09-29 5 views
0

Ich habe eine bi-gerichteten gewichteten Graphen mit etwa 5000 Knoten und ich habe eine Liste von "wichtigen" Knoten (100 oder so). Wie finde ich bei einem Startknoten und einem Endknoten den kürzesten Abstand zwischen diesen beiden Knoten, die mindestens einen der "wichtigen" Knoten passieren. Beachten Sie, dass keine negativen Kanten vorhanden sind. Ich implementierte den Dijkstra-Algorithmus, um die kürzeste Entfernung bei zwei Knoten zu finden. Und die einzige Art, wie ich dieses Problem lösen könnte, wäre, die Liste der wichtigen Knoten durchzugehen, die Entfernung von Start -> Wichtiger Knoten # 1 -> Ende für alle wichtigen Knoten zu finden und dann das Minimum zu nehmen. Gibt es einen schnelleren Weg, dies zu lösen?Wie findet man den kürzesten Abstand zwischen zwei Knoten, die mindestens einen der obligatorischen Knoten passieren?

Antwort

1

Ihr Ansatz ist absolut richtig, was Sie brauchen, ist Dijkstra weniger oft anzuwenden. Dieses Problem kann leicht gelöst werden, indem Dijkstra nur zweimal angewendet wird.

  • Bewerben Dijkstra mit Start als Quelle. Speichern Sie die Abstände in Array fromS.

  • Wenden Sie Dijkstra noch einmal an. Dieses Mal nehmen Sie Ende als Quelle. Speichern Sie die Abstände im Array bis E. Da Ihre Grafik ungerichtet ist die kürzeste Entfernung von Ende Knoten zu jedem anderen Knoten ist der kürzeste Abstand von jedem anderen Knoten zu Ende Knoten. (Das ist der Trick).

  • Suchen Sie die erforderliche kürzeste Entfernung.

    For node in importantNodes : 
        ans = min (fromS [node] + toE[node] , ans) 
    return ans 
    
Verwandte Themen