Verwenden Sie den BFS-Algorithmus, um das Diagramm zu untersuchen und den kürzesten Pfad auszugeben
P粉633075725
2023-09-03 11:42:48
<p>Ziel des Programms ist es, verschiedene Flughäfen zu durchqueren und mithilfe eines Breitensuchalgorithmus den kürzesten Weg zwischen PHX und BKK auszugeben. <strong>Ich habe jedoch Probleme beim Drucken der Ergebnisse. </strong></p>
<p>Die erwartete Ausgabe (kürzester Pfad) ist: PHX -> LAX ->
<pre class="brush:php;toolbar:false;">const airports = 'PHX BKK OKC JFK LAX MEX EZE HEL LOS LAP LIM'.split(' ');
const Routen = [
['PHX', 'LAX'],
['PHX', 'JFK'],
['JFK', 'OKC'],
['JFK', 'HEL'],
['JFK', 'LOS'],
['MEX', 'LAX'],
['MEX', 'BKK'],
['MEX', 'LIM'],
['MEX', 'EZE'],
['LIM', 'BKK'],
];
//Der Graph
const adjacencyList = new Map();
//Knoten hinzufügen
Funktion addNode(Flughafen) {
adjacencyList.set(airport, []);
}
// Kante hinzufügen, ungerichtet
Funktion addEdge(Ursprung, Ziel) {
adjacencyList.get(origin).push(destination);
adjacencyList.get(destination).push(origin);
}
// Das Diagramm erstellen
Flughäfen.forEach(addNode);
// Jede Route durchlaufen und die Werte in die Funktion addEdge verteilen
Routen.forEach(route => addEdge(...route));</pre>
<p>Mit dem Knoten als Startpunkt (Standort) und der Kante als Ziel ist der Graph ungerichtet</p>
<pre class="brush:php;toolbar:false;">function bfs(start) {
const besuchte = new Set();
besuchte.add(start); // Den Startknoten zur besuchten Liste hinzufügen
const queue = [start];
while (queue.length > 0) {
const Airport = queue.shift(); // Warteschlange ändern
const Destinations = adjacencyList.get(airport);
for (const Ziel der Ziele) {
if (destination === 'BKK') {
console.log(`BFS hat Bangkok gefunden!`)
//console.log(path);
}
if (!visited.has(destination)) {
besuchte.add(Ziel);
queue.push(Ziel);
}
}
}
}
bfs('PHX')</pre></p>
我能够按照评论中InSync的建议解决了这个问题
在bfs()函数中,oldpath用于存储每个节点(父节点)所经过的路径,shortest path用于存储结果
新函数的作用很简单,将父节点添加到shortestPath中,然后找到父节点的父节点(如果存在),循环在当前父节点为根节点时退出
不要将节点标记为已访问,而是利用这个机会将该节点与其父节点标记。您可以使用一个 Map 来:
我还建议在函数中避免引用全局变量,而是将所有需要的内容作为参数传递: