Gunakan algoritma BFS untuk meneroka graf dan keluarkan laluan terpendek
P粉633075725
2023-09-03 11:42:48
<p>Matlamat program ini adalah untuk melalui pelbagai lapangan terbang dan mengeluarkan laluan terpendek antara PHX dan BKK menggunakan algoritma carian pertama luas. <strong>Walau bagaimanapun, saya menghadapi masalah mencetak keputusan. </strong></p>
<p>Keluaran yang dijangkakan (laluan terpendek) ialah: PHX ->
<pre class="brush:php;toolbar:false;">const airports = 'PHX BKK OKC JFK LAX MEX EZE HEL LOS LAP LIM'.split(' ');
laluan const = [
['PHX', 'LAX'],
['PHX', 'JFK'],
['JFK', 'OKC'],
['JFK', 'HEL'],
['JFK', 'LOS'],
['MEX', 'LAX'],
['MEX', 'BKK'],
['MEX', 'LIM'],
['MEX', 'EZE'],
['LIM', 'BKK'],
];
//Graf
const adjacencyList = Peta baharu();
//Tambah nod
function addNode(lapangan terbang) {
adjacencyList.set(lapangan terbang, []);
}
// Tambah tepi, tidak terarah
fungsi addEdge(asal, destinasi) {
adjacencyList.get(asal).push(destination);
adjacencyList.get(destination).push(asal);
}
// Cipta Graf
airports.forEach(addNode);
// gelung melalui setiap laluan dan sebarkan nilai ke dalam fungsi addEdge
route.forEach(route => addEdge(...route));</pre>
<p>Dengan nod sebagai titik permulaan (tapak) dan tepi sebagai destinasi, graf tidak terarah</p>
<pre class="brush:php;toolbar:false;">function bfs(start) {
const dilawati = new Set();
visited.add(start); // Tambahkan nod permulaan pada senarai yang dilawati
const queue = [mula];
manakala (queue.length > 0) {
const airport = queue.shift(); // tukar queue
destinasi const = adjacencyList.get(lapangan terbang);
untuk (destinasi const destinasi) {
jika (destinasi === 'BKK') {
console.log(`BFS jumpa Bangkok!`)
//console.log(path);
}
jika (!visited.has(destination)) {
visited.add(destination);
queue.push(destinasi);
}
}
}
}
bfs('PHX')</pre></p>
Saya dapat menyelesaikan isu ini dengan mengikuti cadangan InSync dalam ulasan
Dalam fungsi bfs(), oldpath digunakan untuk menyimpan laluan yang dilalui oleh setiap nod (parent nod), dan laluan terpendek digunakan untuk menyimpan hasilnya
Fungsi fungsi baharu adalah sangat mudah Tambahkan nod induk ke shortestPath, kemudian cari nod induk nod induk (jika wujud), dan gelung keluar apabila nod induk semasa ialah nod akar
Daripada menandakan nod sebagai dilawati, gunakan peluang ini untuk menandai nod dengan induknya. Anda boleh menggunakan Peta untuk:
Saya juga mengesyorkan mengelakkan merujuk pembolehubah global dalam fungsi dan sebaliknya menghantar semua yang diperlukan sebagai parameter: