class Graph {
adjacencyList: Map<number, number[]>;
constructor() {
this.adjacencyList = new Map();
}
addEdge(u: number, v: number) {
if (!this.adjacencyList.has(u)) this.adjacencyList.set(u, []);
if (!this.adjacencyList.has(v)) this.adjacencyList.set(v, []);
this.adjacencyList.get(u)!.push(v);
this.adjacencyList.get(v)!.push(u);
}
shortestPathBFS(start: number, target: number): {distance: number, path: number[]} {
const queue: number[] = [];
const distances: Map<number, number> = new Map();
const parents: Map<number, number | null> = new Map();
queue.push(start);
distances.set(start, 0);
parents.set(start, null);
while (queue.length > 0) {
const current = queue.shift()!;
if (current === target) break;
for (const neighbor of this.adjacencyList.get(current) || []) {
if (!distances.has(neighbor)) {
queue.push(neighbor); // enqueue neighbor
distances.set(neighbor, distances.get(current)! + 1); // set distance
parents.set(neighbor, current); // track path
}
}
}
if (!distances.has(target)) {
return { distance: -1, path: [] };
}
const path: number[] = [];
let node: number | null = target;
while (node !== null) {
path.push(node);
node = parents.get(node) || null;
}
path.reverse();
return { distance: distances.get(target)!, path };
}
}
// Driver code
const graph = new Graph();
graph.addEdge(0, 1);
graph.addEdge(0, 2);
graph.addEdge(1, 3);
graph.addEdge(1, 4);
const result = graph.shortestPathBFS(0, 4);
console.log(`Shortest path length: ${result.distance}`);
console.log(`Path: ${result.path.join(' -> ')}`);queue.push(start);
distances.set(start, 0);
parents.set(start, null);
Initialize BFS with start node distance zero and no parent
const current = queue.shift()!;
if (current === target) break;
Dequeue node and stop if target found
for (const neighbor of this.adjacencyList.get(current) || []) {
if (!distances.has(neighbor)) {
queue.push(neighbor);
distances.set(neighbor, distances.get(current)! + 1);
parents.set(neighbor, current);
}
}
Enqueue unvisited neighbors, set their distance and parent
if (!distances.has(target)) {
return { distance: -1, path: [] };
}
Handle case when target is unreachable
while (node !== null) {
path.push(node);
node = parents.get(node) || null;
}
path.reverse();
Reconstruct path from target to start using parents
Shortest path length: 2
Path: 0 -> 1 -> 4