2018-10-12 15:37:13 -04:00
|
|
|
---
|
|
|
|
title: Breadth-First Search
|
|
|
|
---
|
2019-07-24 00:59:27 -07:00
|
|
|
# Breadth-First Search
|
2018-10-12 15:37:13 -04:00
|
|
|
|
|
|
|
|
2019-07-24 00:59:27 -07:00
|
|
|
---
|
|
|
|
## Solutions
|
|
|
|
|
|
|
|
<details><summary>Solution 1 (Click to Show/Hide)</summary>
|
|
|
|
|
|
|
|
```js
|
|
|
|
function bfs(graph, root) {
|
|
|
|
// Distance object returned
|
|
|
|
var nodesLen = {};
|
|
|
|
// Set all distances to infinity
|
|
|
|
for (var i = 0; i < graph.length; i++) {
|
|
|
|
nodesLen[i] = Infinity;
|
|
|
|
}
|
|
|
|
nodesLen[root] = 0; // ...except root node
|
|
|
|
var queue = [root]; // Keep track of nodes to visit
|
|
|
|
var current; // Current node traversing
|
|
|
|
// Keep on going until no more nodes to traverse
|
|
|
|
while (queue.length !== 0) {
|
|
|
|
current = queue.shift();
|
|
|
|
// Get adjacent nodes from current node
|
|
|
|
var curConnected = graph[current]; // Get layer of edges from current
|
|
|
|
var neighborIdx = []; // List of nodes with edges
|
|
|
|
var idx = curConnected.indexOf(1); // Get first edge connection
|
|
|
|
while (idx !== -1) {
|
|
|
|
neighborIdx.push(idx); // Add to list of neighbors
|
|
|
|
idx = curConnected.indexOf(1, idx + 1); // Keep on searching
|
|
|
|
}
|
|
|
|
// Loop through neighbors and get lengths
|
|
|
|
for (var j = 0; j < neighborIdx.length; j++) {
|
|
|
|
// Increment distance for nodes traversed
|
|
|
|
if (nodesLen[neighborIdx[j]] === Infinity) {
|
|
|
|
nodesLen[neighborIdx[j]] = nodesLen[current] + 1;
|
|
|
|
queue.push(neighborIdx[j]); // Add new neighbors to queue
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nodesLen;
|
|
|
|
}
|
2018-10-12 15:37:13 -04:00
|
|
|
```
|
2019-07-24 00:59:27 -07:00
|
|
|
</details>
|