2017-12-30 37 views
-1

ich eine Implementierung von Dijkstra-Algorithmus zu sehen, und ich habe nicht ganz verstanden, einige Teile dieses Codes:Compute Pfade - Dijkstra-Algorithmus

public static void computePaths(Vertex source) { 
    source.minDistance = 0; 
    PriorityQueue<Vertex> vertexQueue = new PriorityQueue<Vertex>(); 
    vertexQueue.add(source); 

    while (!vertexQueue.isEmpty()) { 
     Vertex u = vertexQueue.poll(); 

     // Visit each edge exiting u 
     for (Edge e : u.adjacencies) { 
      Vertex v = e.target; 
      double distanceThroughU = u.minDistance + e.getweight(); 
      if (distanceThroughU < v.minDistance) { 
       vertexQueue.remove(v);  //How can I remove if I didn't add it first, and why do I need to remove? 
       v.minDistance = distanceThroughU; 
       v.previous = u; 
       vertexQueue.add(v);  //Why is it add again? 
      } 
     } 
    } 
} 

ich über Dijkstra-Algorithmus gelesen, damit ich die allgemeine Logik weiß aber, während ich Als ich diese Implementierung sah, gab es ein paar Dinge, die ich nicht verstand, warum sie gemacht wurden. Kann jemand bitte versuchen zu erklären? Vor allem, wo ich die Kommentare habe!

+1

Bitte lesen [mcve] und verbessern Sie Ihre Frage entsprechend. Wie sollen wir wissen, welche Teile des Codes Ihnen Probleme bereiten? – GhostCat

+0

"* Ich sah eine Implementierung von Dijkstras Algorithmus *" - warum fragen Sie nicht den Autor? – Turing85

+0

Das ist keine großartige Implementierung - 'PriorityQueue.remove' ist eine langsame Operation und macht den Code insgesamt ziemlich langsam. ('add' ist offensichtlich notwendig, denn wie sonst kommen Sie zu anderen Vertices?) – Dukeling

Antwort

2

Um die Informationen des Knotens v aktualisieren

Sie wollen die Informationen des Knotens v aktualisieren, weil Sie einen kürzeren in der Prioritätswarteschlange gespeichert Weg zu ihm gefunden.

Die Funktion Remove() entfernt den Knoten , wenn in der Prioritätswarteschlange vorhanden ist.

Danach aktualisieren Sie die Informationen und fügen sie dann erneut mit den aktualisierten Informationen hinzu.