Breadth First Search: Shortest Reach

  • + 1 comment

    js

    const getDistances = (nodes, edges, s) => {
        const visited = new Map();
        const distanceMap = new Map();
        const edgesMap = new Map();
        nodes.forEach((nodeNumber) => {
           visited.set(nodeNumber, 0);
           distanceMap.set(nodeNumber, 0);
           edgesMap.set(nodeNumber, []);
        });
    
        edges.forEach(([u, w]) => {
            edgesMap.get(u).push(w);
            edgesMap.get(w).push(u);
        });
    
        let queue = [];
        queue.push(s);
        while (queue.length > 0) {
            const u = queue.shift();
            const uEdges = edgesMap.get(u);
            visited.set(u, 1);
            for(let j = 0; j < uEdges.length; j++) {
                const w = uEdges[j];
                if (visited.get(w) === 0) {
                    visited.set(w, 1);
                    queue.push(w);
                    distanceMap.set(w, distanceMap.get(u) + 6);
                }
            }
            visited.set(u, 2);
        }
        let distances = Array.from(distanceMap.entries());
        distances = distances.filter(([node]) => {
            return node !== s;
        });
        distances = distances.map(([node, dist]) => {
            return dist === 0 ? -1 : dist;
        });
        return distances;
    }
    
    function bfs(n, m, edges, s) {
        // Write your code here
        const nodes = [];
        for (let i = 1; i <= n; i ++) {
            nodes.push(i);
        }
        return getDistances(nodes, edges, s);
    }