One of the most fascinating uses of graphs is in the optimization of path traversal, which can be used in a vast number of calculations.

As mentioned in the previous chapter, graphs can be used to represent all kinds of information:

  • A network of any kind. Social (friends) or digital (computers or the internet), for example
  • A decision tree
  • Contributions from members of any kind to a cause of any kind
  • Atomic interactions in physics, chemistry or biology

Navigation between various endpoints - If you apply weighting to the edges or vertices, you can run useful calculations for just about anything. One of the most common is finding the shortest path between two vertices.

//Bellman-Ford: Shortest path calculation//on an edge-weighted, directed graphconst vertices = ["S", "A", "B", "C", "D", "E"];var memo = {  S:0,  A:Number.POSITIVE_INFINITY,  B:Number.POSITIVE_INFINITY,  C:Number.POSITIVE_INFINITY,  D:Number.POSITIVE_INFINITY,  E:Number.POSITIVE_INFINITY};const graph = [  {from : "S", to : "A", cost: 4},  {from : "S", to :"E", cost: -5},  {from : "A", to :"C", cost: 6},  {from : "B", to :"A", cost: 3},  {from : "C", to :"B", cost: -2},  {from : "D", to :"C", cost: 3},  {from : "D", to :"A", cost: 10},  {from : "E", to: "D", cost: 8}];const iterate = () => {  var doItAgain = false;  for(fromVertex of vertices){    const edges = graph.filter(path => {      return path.from === fromVertex;    });    for(edge of edges){      const potentialCost = memo[edge.from] + edge.cost;      if(potentialCost < memo[edge.to]){        memo[edge.to] = potentialCost;        doItAgain = true;      }    }  }  return doItAgain;}for(vertex of vertices){  if(!iterate()) break;}console.log(memo);