Graphs
Networks of nodes and edges
Graph Representations & Traversals
Graphs model relationships between entities. They can be directed/undirected, weighted/unweighted, cyclic/acyclic. Graphs appear in social networks, maps, dependency resolution, and countless interview problems.
Graph Types
typescript
// Graph Implementation & BFS/DFS
// Adjacency List representation
class Graph {
private adj = new Map<string, string[]>();
addEdge(u: string, v: string, directed = false): void {
if (!this.adj.has(u)) this.adj.set(u, []);
this.adj.get(u)!.push(v);
if (!directed) {
if (!this.adj.has(v)) this.adj.set(v, []);
this.adj.get(v)!.push(u);
}
}
// BFS — O(V + E) — Level-order, shortest path in unweighted
bfs(start: string): string[] {
const visited = new Set<string>([start]);
const queue = [start];
const result: string[] = [];
while (queue.length) {
const node = queue.shift()!;
result.push(node);
for (const neighbor of this.adj.get(node) || []) {
if (!visited.has(neighbor)) {
visited.add(neighbor);
queue.push(neighbor);
}
}
}
return result;
}
// DFS — O(V + E) — Path finding, cycle detection
dfs(start: string): string[] {
const visited = new Set<string>();
const result: string[] = [];
const visit = (node: string) => {
visited.add(node);
result.push(node);
for (const neighbor of this.adj.get(node) || []) {
if (!visited.has(neighbor)) visit(neighbor);
}
};
visit(start);
return result;
}
}
// Number of Islands — Classic BFS/DFS
function numIslands(grid: string[][]): number {
const rows = grid.length, cols = grid[0].length;
let count = 0;
function dfs(r: number, c: number): void {
if (r < 0 || r >= rows || c < 0 || c >= cols || grid[r][c] === '0') return;
grid[r][c] = '0'; // mark visited
dfs(r + 1, c); dfs(r - 1, c); dfs(r, c + 1); dfs(r, c - 1);
}
for (let r = 0; r < rows; r++) {
for (let c = 0; c < cols; c++) {
if (grid[r][c] === '1') { count++; dfs(r, c); }
}
}
return count;
}