Saturday, August 27, 2022

GRAPH Traveral

 let routes = [

    { start: "mumbai", end: "paris" }
    ,{ start: "mumbai", end: "dubai" }
    ,{ start: "mumbai", end: "boston" }
    ,{ start: "paris", end: "boston" }
    ,{ start: "dubai", end: "paris" }
    ,{ start: "paris", end: "ny" }
    ,{ start: "dubai", end: "ny" }
    ,{ start: "boston", end: "ny" }
    ,{ start: "ny", end: "dubai" }
]

/* we want a graph like this
 *
    {
        mumbai:[paris, dubai, ny],
        paris: [dubai, ny]
    }
 */

const queue = [];

const hasPath = (graph, src, dest) => {
   
    if (src === dest) {
        queue.push(src)
        return true;
    }
 
    for (let neighbor in graph[src]) {
        queue.push(src)

        if (hasPath(graph, graph[src][neighbor], dest)) {
            return true;
        }
       
    }
    console.log("return false");

    queue.shift()  
    return false;
}

const buildGraph = (edges) => {
    const graph = {};
 
    edges.forEach(edge => {
        if (!graph.hasOwnProperty(edge.start)) graph[edge.start] = []; // this is 1 directional graph.
        graph[edge.start].push(edge.end)
    });
   
    console.log(graph);
    return graph;
}


const buildGraphUndirected = (edges, src, dest) => {
    const graph = {};


    for (let edge in edges) {
        if (!graph.hasOwnProperty(edges[edge]["start"]))graph[edges[edge]["start"]] = [];
        if (!graph.hasOwnProperty(edges[edge]["end"]))graph[edges[edge]["end"]] = [];       // this would become non-directed graph

        graph[edges[edge]["start"]].push(edges[edge]["end"])
        graph[edges[edge]["end"]].push(edges[edge]["start"]);        // this would become non-directed graph
    }
    //console.log(graph);
    return graph;
    }


hasPath(buildGraph(routes), "mumbai", "boston");

console.log("----------------------------------------");
console.log(queue)
//buildGraphUndirected(routes);
console.log("----------------------------------------");


    /*
     * alternate for of loop ...but doesn't work in IE

     * if input was of tuples we could have used iterable syntax
     * need to put up another code block for that type

   
    for (let edge of edges) {

    }
     */