Typically implemented in terms of arrays; eg:
- one array records the vertices: each vertex contains pointers to its edges
- one array records the edges: each edge contains pointers to its endpoints
Edges may be directed (in which case the end points are ordered) or undirected (in which case the end points are unordered), weighted (in which case we need to store an additional measure, the weight, in the tuple) or unweighted. If two vertices have multiple (parallel) edges, then the edges array must store one entry for each edge.