AlgoViz
—
← Back to trail

How Graphs Are Stored

Easy+80 XP

A graph is dots and lines — but a computer stores it as numbers. See the picture, the matrix, and the list as the same graph.

No visualization loaded.

Watch

—

i

Press Run to begin.

A graph is just dots (nodes) joined by lines (edges) — cities linked by roads, people linked by friendships. But a computer can't store a 'picture'; it stores numbers. There are two classic ways to write a graph down. The adjacency MATRIX is a grid where row A, column B holds a 1 if there's an edge A–B (and a 0 if not). The adjacency LIST instead keeps, for each node, a little list of its neighbours. Both describe the EXACT same graph — this lesson draws all three side by side so you can watch one edge light up the picture, the matrix cell, and the list entry all at once.

▸What's an adjacency matrix?

A square grid with one row and one column per node. The cell at row A, column B is 1 if there's an edge from A to B, and 0 if there isn't. To check 'are A and B connected?' you just look at one cell — instant. The catch: even if a graph has almost no edges, you still store a full N×N grid of mostly-0s, so it uses O(N²) memory.

▸What's an adjacency list?

For each node, you keep a short list of just its neighbours. A → [B, E], B → [A, C], and so on. You only store edges that actually exist, so a graph with N nodes and E edges takes O(N+E) memory. The trade-off: to check 'are A and B connected?' you have to scan A's list instead of reading one cell.

▸When should I use which?

Use the MATRIX when the graph is DENSE (lots of edges) or when you constantly ask 'is X connected to Y?' — that check is O(1). Use the LIST when the graph is SPARSE (few edges, which is most real-world graphs) and you mostly want to walk a node's neighbours — it saves a ton of memory and is what BFS/DFS use.

▸What does 'sparse vs dense' mean?

It's about how many edges a graph has compared to the most it COULD have. With N nodes the maximum is about N² edges. 'Dense' means it has close to that many — most pairs are connected. 'Sparse' means it has far fewer, often only a handful per node (think road maps or friend networks). Sparse graphs waste most of a matrix on 0s, which is exactly when the list wins.

▸Why does direction matter?

An UNDIRECTED edge A–B goes both ways (a two-way street), so you set matrix[A][B] AND matrix[B][A] to 1, and you add B to A's list AND A to B's list — the matrix comes out symmetric. A DIRECTED edge A→B goes one way (a one-way street or a 'follows' on social media), so you set only matrix[A][B] and only add B to A's list. Same storage shapes, but you fill in one side or both.

🧠The picture, the adjacency matrix, and the adjacency list are three ways to write down the SAME graph. Matrix = O(N²) space, O(1) edge-lookup, great for dense graphs. List = O(N+E) space, great for sparse graphs (most of them).
📈

How the work grows

input size n →work ↑
Time
O(1) — matrix edge-lookup
Space
O(N²) matrix · O(N+E) list

O(1) — matrix edge-lookup is instant — doesn't grow at all. An adjacency matrix answers 'is A connected to B?' by reading a single cell — O(1) — but it pays for that with O(N²) memory, storing a 0 for every non-edge. An adjacency list flips the trade: it uses only O(N+E) memory (great when the graph is sparse), but checking a specific edge means scanning a node's neighbour list. Same graph, two storage choices, opposite strengths.

Faint dotted lines = O(1) (flat) and O(n) (straight) for comparison.

edge just added (picture + matrix + list)existing edge / 1 in matrix