Bus Routes

HardArrayHash TableBreadth-First Search

Solution

export function numBusesToDestination(routes: number[][], source: number, target: number): number {
  const busRoutes = new Map<number, Set<number>>();
  for (let bus = 0; bus < routes.length; bus++) {
    for (const busStop of routes[bus]) {
      const busRoute = busRoutes.get(busStop) ?? new Set();
      busRoute.add(bus);
      busRoutes.set(busStop, busRoute);
    }
  }
 
  let queue: number[][] = [[source, 0]];
  const visited = new Set<number>();
  while (0 < queue.length) {
    const nextQueue: number[][] = [];
    for (const [busStop, busCount] of queue) {
      if (busStop === target) {
        return busCount;
      }
      const busRoute = busRoutes.get(busStop) ?? new Set();
      for (const bus of busRoute) {
        for (const nextBusStop of routes[bus]) {
          if (visited.has(nextBusStop)) continue;
          nextQueue.push([nextBusStop, busCount + 1]);
          visited.add(nextBusStop);
        }
        routes[bus] = [];
      }
    }
    queue = nextQueue;
  }
  return -1;
}