Mit einem stack zu finden, der kürzeste Weg in die Breite zuerst-Suche

Ich bin eine harte Zeit der Umsetzung ein shortest-path-Algorithmus für meine Grafik. Viele Beiträge auf dieser Abdeckung, welcher Algorithmus zu verwenden ist, aber nichts grundlegendes. Ich glaube, ich habe umgesetzt der code von dieser Frage. Für jeden Knoten durchzogen ist, Speicher ich ein array, der angibt, wo ich habe kommen von. Ich bin mir nicht sicher, wie die Arbeit durch den Stapel, um den kürzesten Weg zu finden.

Habe ich die folgenden Knoten:

Mit einem stack zu finden, der kürzeste Weg in die Breite zuerst-Suche

Meine Liste der Scheitelpunkte ist :

Tokio , hawaii, san francisco, los angeles, san diego, chicago, new york, miami, london

Suchen für den Weg von London nach Hawaii, mein stack endet auf der Suche wie:

000000000

000400000

101100000

033033000

020202000

005500550

000007707

000006066

000000880

irgendwie Tokio bekommt, verbunden mit San Diego, aber der rest ( denke ich) korrekt aussieht. Unten ist meine Umsetzung, aber ich weiß nicht, wie zu laufen Sie durch die Stapel-und trace-mein Weg zurück. Der untenstehende code gibt den Pfad: hawaii, hawaii, hawaii. Es ist falsch.

 public static List<string> ShortestPath(Graph graph, string src, string dest)
    {
        List<string> path = new List<string>();

        List<string> city_ref = graph.GetVertices();
        Queue<string> Visited = new Queue<string>();
        Queue<string> ToVisit = new Queue<string>();
        Stack<int[]> stack = new Stack<int[]>();

        ToVisit.Enqueue(src);
        while (ToVisit.Count != 0)
        {
            string V = ToVisit.Dequeue();
            if (Visited.Contains(V))
                ;
            else
            {
                int[] previous = new int[city_ref.Count];
                for (int i = 0; i < graph.Neighbors(V).Count; i++)
                {
                    //previous[i] = -1;
                    ToVisit.Enqueue(graph.Neighbors(V)[i]);
                    int pointer = city_ref.IndexOf(graph.Neighbors(V)[i]);
                    previous[pointer] = city_ref.IndexOf(V);
                }

                stack.Push(previous);
                Visited.Enqueue(V);
            }

        }

        int path_val = city_ref.IndexOf(dest);
        while(stack.Count != 0)
        {
            int[] i = stack.Pop();

            for (int p = 0; p < i.Length; p++)
            {
                if (i[p] == path_val)
                {
                    path.Add(city_ref[i[p]]);
                    path_val = i[p];
                }
            }

        }
        return path;
    }
  • Das BFS arbeitet mit Warteschlange tatsächlich. Sie können einen Blick auf alle basic-code des bfs zu verstehen, ist es eindeutig. Mit Stapel-Diagramm der Punktmenge in die Tiefe zunächst eine Mode, die sich nicht sicher kürzeste Weg tatsächlich.
  • Ach ja, und gewichteter graph(da wo die Kanten sind nicht von gleichem Gewicht) bfs wird nicht funktionieren. Implementierung des Dijkstra-Algorithmus statt.
  • eigentlich Dijkstra findet kürzeste Pfade zu allen Knoten aus ausgewählten Knoten; will einfach nur ein Pfad zwischen ein paar start-Ende -- aber tatsächlich die Ideen sind fast die gleichen.
  • gerade jetzt, ich bin einfach zu ignorieren die GEWICHTE. Ich glaube nicht, dass ich verwenden können die bfs-Warteschlange, um den kürzesten Weg zu finden? wie kann ich verfolgen, wo ich gewesen bin?
InformationsquelleAutor chebyshev | 2013-11-17
Schreibe einen Kommentar