Mit BFS-Algorithmus, um den kürzesten Weg zu finden
std::list <int> q;
std::vector<bool> visited(cols + 1);
for(int i = 1; i <= cols; i++) visited[i] = false;
visited[x] = true;
if(!l[x].empty())
{
for(std::list<int>::iterator i = l[x].begin(); i != l[x].end(); i++)
{
q.push_back(x); q.push_back(* i);
}
while(!q.empty())
{
y = q.back(); q.pop_back();
x = q.back(); q.pop_back();
if(!visited[y])
{
visited[y] = true;
if(!l[y].empty())
for(std::list<int>::iterator i = l[y].begin(); i != l[y].end(); i++)
{
if(!visited[*i])
{q.push_back(y); q.push_back(* i);}
}
dfst[x].push_back(y);
if(flag != 0) dfst[y].push_back(x);
}
}
}
Dies ist meine DFS-Algorithmus für das finden der Spannbaum in einem Graphen. Ich brauche, um zu konvertieren, um die BFS-Algorithmus zu finden, den kürzesten Pfad zwischen zwei Eckpunkten. Gut...wie kann ich dies tun? Ist der BFS-Algorithmus etwas ähnlich der obigen? Oder muss ich es schreiben von Anfang an?
l - Nachbarschaft-Liste
dfst - array holding spanning tree am Ende
x - starting vertex
y - Helfer variable
InformationsquelleAutor user2489034 | 2013-06-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
DFS-und BFS sind im wesentlichen die gleichen algorithmen. Der trick ist, die Daten-Struktur, die Sie verwenden, oder eher die Knoten, die Sie erkunden zuerst.
Einer Tiefe-zuerst-Suche nutzt einen stack und würde damit gehen so weit unten wie möglich, bevor Sie zurück in den Algorithmus.
Nutzen eine Breite erste Suche, würden Sie brauchen, um eine Warteschlange von Knoten, und von jedem Knoten aus, fügen Sie Ihren Nachbarn (wenn nicht bereits besucht), um die Warteschlange, und dann den rest des übergeordneten Knotens Nachbarn, bevor Sie fortfahren ab.
Wäre es nicht zu einer drastischen Veränderung des Codes, nur eine änderung in, wie man Knoten aus der Liste.
Statt knallen die Weg von der Rückseite würde Sie benutzen Sie einfach
q.pop_front()
um Ihren Knoten.Geklärt für Genauigkeit, Sie sind im Grunde den gleichen Algorithmus, nur mit dem Unterschied, wie Sie hinzufügen und entfernen von Knoten aus der Struktur der Daten. 🙂
Ändern der Liste in die deque, und pop_back() , pop_front() zeigt leeres array als Ergebnis.
Haben Sie versucht, nur mit der Liste? Haben Sie implementiert den stack im Bezug auf eine Liste, und Sie können das gleiche tun, mit einer Warteschlange.
Sie umgesetzt werden können, genau der gleiche, den Austausch einer Warteschlange einen Stapel, oder Umgekehrt (und natürlich zusammen mit Ihnen die Methodennamen für die Umsetzung der ein element in der Struktur und unter einem element aus).
InformationsquelleAutor ardent
BFS ist ähnlich wie die DFS. Statt wie tief, wie Sie können, backtracking und sich wiederholende, schauen Sie auf alle Knoten auf Tiefe 1, dann alle Knoten der Tiefe 2, usw, bis Sie besucht haben, werden alle Knoten.
Grundlegende Algorithmus:
InformationsquelleAutor Daniel
Für Die Suche Nach Kürzesten Weg
(Geschrieben in C++ /C++11)
Ich denke, dass dies wichtig, um hier hinzufügen, vor allem, weil der Titel ist auf kürzesten Wege! (der code unten, die tatsächlich ermöglichen, Sie zu finden)
Zusätzlich:
Wie oben erwähnt (in den Kommentaren zu der zweiten Antwort) DFS-und BFS sind ziemlich viel nicht(!) die gleichen algorithmen, die die ähnlichkeit im code ersetzen den stack mit einem queue und so dass Sie springen von einem zum anderen macht Sie nicht "im wesentlichen gleich". Das BFS ist bei weitem die bessere/richtige (zwischen den beiden), um den kürzesten Weg zu finden in einem ungewichteten Graphen. Das BFS ist der Aufbau von Schichten aus der Quelle und DFS geht so tief wie möglich.
Eigentlich beim laufen BFS (um den kürzesten Weg zu finden) sollten Sie die initialize-Knoten mit "Abstand" - parameter mit einer sehr großen Anzahl und statt mit der besuchten DS, aktualisieren Sie es, um die Eltern Abstand + 1 (nur wenn es noch mit dem Wert initialisiert).
Einen einfach Beispiel wäre:
Inspiriert durch Steven & Felix, von:
Wettbewerbsfähige Programmierung 3
InformationsquelleAutor Kohn1001
Nein,Sie haben nicht zu viel ändern im code. ersetzen Sie einfach ersetzen Stapel im Falle von DFS mit Warteschlange und es wird dem BFS.
Unterschied in der Implementierung von BFS und DFS ist, dass "BFS durchgeführt wird Warteschlange und DFS mit Stack" (Grund liegt auf der Hand, dass die DFS nicht die Tiefe wie im Labyrinth.)
Veränderungen SEHEN Sie selbst:
DFS:
BFS:
Wie Sie sehen können, die Umsetzung der beiden unterscheiden sich gerade "in der Verwendung von STACK und QUEUE".
Hoffe, das hilft !
InformationsquelleAutor Shashank Jain