Think about memory usage and efficiency when edges are few.
An adjacency list uses less memory and is faster for sparse graphs because it stores only existing edges. Adjacency matrix uses fixed space for all possible edges, which is wasteful for sparse graphs.
let mut matrix = vec![vec![0; 3]; 3]; matrix[0][1] = 1; matrix[1][2] = 1; matrix[2][0] = 1; for row in &matrix { println!("{:?}", row); }
Check which indices are set to 1 for edges.
The matrix rows represent source vertices and columns represent destination vertices. Setting matrix[0][1] = 1 means edge from 0 to 1.
let mut adj_list: Vec<Vec<usize>> = vec![vec![], vec![], vec![]]; adj_list[0].push(2); adj_list[0].push(1); adj_list[1].push(2); for (i, neighbors) in adj_list.iter().enumerate() { print!("{} -> ", i); for &n in neighbors { print!("{} -> ", n); } println!("null"); }
Remember the order edges were added to each list.
Edges are stored in the order they are added. For vertex 0, edges to 2 and then 1 are added, so neighbors are [2,1].
Think about how many edges are stored in each structure.
An adjacency matrix for 10,000 vertices uses 100 million entries, which is huge. An adjacency list stores only 15,000 edges, much less memory.
Consider time complexity of checking edge existence.
An adjacency matrix allows constant time O(1) check for edge existence, which is faster than searching adjacency lists or edge lists.
