Graphs

A graph consists of vertices (nodes) connected by edges. Graphs model relationships — social networks, road maps, dependency trees.

Types

  • Directed — edges have a direction (A -> B)
  • Undirected — edges go both ways (A <-> B)
  • Weighted — edges have a cost or distance
  • Unweighted — all edges are equal

Adjacency List Representation

The most common representation — a dictionary mapping each vertex to its neighbors:

public class Graph
{
    private Dictionary<string, List<string>> adjList = new();

    public void AddVertex(string vertex)
    {
        if (!adjList.ContainsKey(vertex))
            adjList[vertex] = new List<string>();
    }

    public void AddEdge(string from, string to)
    {
        AddVertex(from);
        AddVertex(to);
        adjList[from].Add(to);
        adjList[to].Add(from); // remove for directed graph
    }

    public List<string> GetNeighbors(string vertex)
    {
        return adjList.GetValueOrDefault(vertex, new List<string>());
    }
}

BFS Traversal

Breadth-First Search explores all neighbors at the current depth before moving deeper:

public List<string> BFS(string start)
{
    var visited = new HashSet<string>();
    var queue = new Queue<string>();
    var result = new List<string>();

    queue.Enqueue(start);
    visited.Add(start);

    while (queue.Count > 0)
    {
        string vertex = queue.Dequeue();
        result.Add(vertex);

        foreach (string neighbor in GetNeighbors(vertex))
        {
            if (!visited.Contains(neighbor))
            {
                visited.Add(neighbor);
                queue.Enqueue(neighbor);
            }
        }
    }

    return result;
}

// Usage
var graph = new Graph();
graph.AddEdge("A", "B");
graph.AddEdge("A", "C");
graph.AddEdge("B", "D");
graph.AddEdge("C", "D");

var order = graph.BFS("A"); // [A, B, C, D]