* Review the EN heading format. * Fix pythontutor headings. * Fix pythontutor headings. * bug fixes * Fix headings in **/summary.md * Revisit the CN-to-EN translation for Python code using Claude-4.5 * Revisit the CN-to-EN translation for Java code using Claude-4.5 * Revisit the CN-to-EN translation for Cpp code using Claude-4.5. * Fix the dictionary. * Fix cpp code translation for the multipart strings. * Translate Go code to English. * Update workflows to test EN code. * Add EN translation for C. * Add EN translation for CSharp. * Add EN translation for Swift. * Trigger the CI check. * Revert. * Update en/hash_map.md * Add the EN version of Dart code. * Add the EN version of Kotlin code. * Add missing code files. * Add the EN version of JavaScript code. * Add the EN version of TypeScript code. * Fix the workflows. * Add the EN version of Ruby code. * Add the EN version of Rust code. * Update the CI check for the English version code. * Update Python CI check. * Fix cmakelists for en/C code. * Fix Ruby comments
6.2 KiB
Basic Operations on Graphs
Basic operations on graphs can be divided into operations on "edges" and operations on "vertices". Under the two representation methods of "adjacency matrix" and "adjacency list", the implementation methods differ.
Implementation Based on Adjacency Matrix
Given an undirected graph with n vertices, the various operations are implemented as shown in the figure below.
- Adding or removing an edge: Directly modify the specified edge in the adjacency matrix, using
O(1)time. Since it is an undirected graph, both directions of the edge need to be updated simultaneously. - Adding a vertex: Add a row and a column at the end of the adjacency matrix and fill them all with $0$s, using
O(n)time. - Removing a vertex: Delete a row and a column in the adjacency matrix. The worst case occurs when removing the first row and column, requiring
(n-1)^2elements to be "moved up and to the left", thus usingO(n^2)time. - Initialization: Pass in
nvertices, initialize a vertex listverticesof lengthn, usingO(n)time; initialize an adjacency matrixadjMatof sizen \times n, usingO(n^2)time.
=== "Initialize adjacency matrix"

The following is the implementation code for graphs represented using an adjacency matrix:
[file]{graph_adjacency_matrix}-[class]{graph_adj_mat}-[func]{}
Implementation Based on Adjacency List
Given an undirected graph with a total of n vertices and m edges, the various operations can be implemented as shown in the figure below.
- Adding an edge: Add the edge at the end of the corresponding vertex's linked list, using
O(1)time. Since it is an undirected graph, edges in both directions need to be added simultaneously. - Removing an edge: Find and remove the specified edge in the corresponding vertex's linked list, using
O(m)time. In an undirected graph, edges in both directions need to be removed simultaneously. - Adding a vertex: Add a linked list in the adjacency list and set the new vertex as the head node of the list, using
O(1)time. - Removing a vertex: Traverse the entire adjacency list and remove all edges containing the specified vertex, using
O(n + m)time. - Initialization: Create
nvertices and2medges in the adjacency list, usingO(n + m)time.
=== "Initialize adjacency list"

The following is the adjacency list code implementation. Compared to the figure above, the actual code has the following differences.
- For convenience in adding and removing vertices, and to simplify the code, we use lists (dynamic arrays) instead of linked lists.
- A hash table is used to store the adjacency list, where
keyis the vertex instance andvalueis the list (linked list) of adjacent vertices for that vertex.
Additionally, we use the Vertex class to represent vertices in the adjacency list. The reason for this is: if we used list indices to distinguish different vertices as with adjacency matrices, then to delete the vertex at index i, we would need to traverse the entire adjacency list and decrement all indices greater than i by 1, which is very inefficient. However, if each vertex is a unique Vertex instance, deleting a vertex does not require modifying other vertices.
[file]{graph_adjacency_list}-[class]{graph_adj_list}-[func]{}
Efficiency Comparison
Assuming the graph has n vertices and m edges, the table below compares the time efficiency and space efficiency of adjacency matrices and adjacency lists. Note that the adjacency list (linked list) corresponds to the implementation in this text, while the adjacency list (hash table) refers specifically to the implementation where all linked lists are replaced with hash tables.
Table Comparison of adjacency matrix and adjacency list
| Adjacency matrix | Adjacency list (linked list) | Adjacency list (hash table) | |
|---|---|---|---|
| Determine adjacency | O(1) |
O(n) |
O(1) |
| Add an edge | O(1) |
O(1) |
O(1) |
| Remove an edge | O(1) |
O(n) |
O(1) |
| Add a vertex | O(n) |
O(1) |
O(1) |
| Remove a vertex | O(n^2) |
O(n + m) |
O(n) |
| Memory space usage | O(n^2) |
O(n + m) |
O(n + m) |
Observing the table above, it appears that the adjacency list (hash table) has the best time efficiency and space efficiency. However, in practice, operating on edges in the adjacency matrix is more efficient, requiring only a single array access or assignment operation. Overall, adjacency matrices embody the principle of "trading space for time", while adjacency lists embody "trading time for space".







