From d7eb50d1b5dcc9fee0d3ee4773c41af3df8abbfc Mon Sep 17 00:00:00 2001 From: rongyi Date: Wed, 23 Jul 2025 16:36:55 +0800 Subject: [PATCH 1/2] polish graph --- .../chapter_graph/graph_adjacency_list.rs | 25 +++++++------------ .../chapter_graph/graph_adjacency_matrix.rs | 4 +-- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/codes/rust/chapter_graph/graph_adjacency_list.rs b/codes/rust/chapter_graph/graph_adjacency_list.rs index 5e014d10c8..4fc6321671 100644 --- a/codes/rust/chapter_graph/graph_adjacency_list.rs +++ b/codes/rust/chapter_graph/graph_adjacency_list.rs @@ -11,7 +11,7 @@ use std::collections::HashMap; /* 基于邻接表实现的无向图类型 */ pub struct GraphAdjList { // 邻接表,key:顶点,value:该顶点的所有邻接顶点 - pub adj_list: HashMap>, + pub adj_list: HashMap>, // maybe HashSet for value part is better? } impl GraphAdjList { @@ -38,31 +38,27 @@ impl GraphAdjList { /* 添加边 */ pub fn add_edge(&mut self, vet1: Vertex, vet2: Vertex) { - if !self.adj_list.contains_key(&vet1) || !self.adj_list.contains_key(&vet2) || vet1 == vet2 - { + if vet1 == vet2 { panic!("value error"); } // 添加边 vet1 - vet2 - self.adj_list.get_mut(&vet1).unwrap().push(vet2); - self.adj_list.get_mut(&vet2).unwrap().push(vet1); + self.adj_list.entry(vet1).or_default().push(vet2); + self.adj_list.entry(vet2).or_default().push(vet1); } /* 删除边 */ #[allow(unused)] pub fn remove_edge(&mut self, vet1: Vertex, vet2: Vertex) { - if !self.adj_list.contains_key(&vet1) || !self.adj_list.contains_key(&vet2) || vet1 == vet2 - { + if vet1 == vet2 { panic!("value error"); } // 删除边 vet1 - vet2 self.adj_list - .get_mut(&vet1) - .unwrap() - .retain(|&vet| vet != vet2); + .entry(vet1) + .and_modify(|v| v.retain(|&e| e != vet2)); self.adj_list - .get_mut(&vet2) - .unwrap() - .retain(|&vet| vet != vet1); + .entry(vet2) + .and_modify(|v| v.retain(|&e| e != vet1)); } /* 添加顶点 */ @@ -77,9 +73,6 @@ impl GraphAdjList { /* 删除顶点 */ #[allow(unused)] pub fn remove_vertex(&mut self, vet: Vertex) { - if !self.adj_list.contains_key(&vet) { - panic!("value error"); - } // 在邻接表中删除顶点 vet 对应的链表 self.adj_list.remove(&vet); // 遍历其他顶点的链表,删除所有包含 vet 的边 diff --git a/codes/rust/chapter_graph/graph_adjacency_matrix.rs b/codes/rust/chapter_graph/graph_adjacency_matrix.rs index ac02fa8151..0444072169 100644 --- a/codes/rust/chapter_graph/graph_adjacency_matrix.rs +++ b/codes/rust/chapter_graph/graph_adjacency_matrix.rs @@ -45,7 +45,7 @@ impl GraphAdjMat { // 在邻接矩阵中添加一行 self.adj_mat.push(vec![0; n]); // 在邻接矩阵中添加一列 - for row in &mut self.adj_mat { + for row in self.adj_mat.iter_mut() { row.push(0); } } @@ -60,7 +60,7 @@ impl GraphAdjMat { // 在邻接矩阵中删除索引 index 的行 self.adj_mat.remove(index); // 在邻接矩阵中删除索引 index 的列 - for row in &mut self.adj_mat { + for row in self.adj_mat.iter_mut() { row.remove(index); } } From ab0be7f3676c775293fa1d0bddbcc373e97ec6ed Mon Sep 17 00:00:00 2001 From: rongyi Date: Wed, 23 Jul 2025 16:44:05 +0800 Subject: [PATCH 2/2] Update graph --- codes/rust/chapter_graph/graph_bfs.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/codes/rust/chapter_graph/graph_bfs.rs b/codes/rust/chapter_graph/graph_bfs.rs index f4706ba437..38bcea0a54 100644 --- a/codes/rust/chapter_graph/graph_bfs.rs +++ b/codes/rust/chapter_graph/graph_bfs.rs @@ -22,8 +22,7 @@ fn graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> Vec { let mut que = VecDeque::new(); que.push_back(start_vet); // 以顶点 vet 为起点,循环直至访问完所有顶点 - while !que.is_empty() { - let vet = que.pop_front().unwrap(); // 队首顶点出队 + while let Some(vet) = que.pop_front() { res.push(vet); // 记录访问顶点 // 遍历该顶点的所有邻接顶点