polish rust (#1790)

* polish graph

* Update graph
This commit is contained in:
rongyi
2025-08-04 14:45:14 +08:00
committed by GitHub
parent 83a806a602
commit 0918fd06f2
3 changed files with 12 additions and 20 deletions

View File

@ -11,7 +11,7 @@ use std::collections::HashMap;
/* 基于邻接表实现的无向图类型 */ /* 基于邻接表实现的无向图类型 */
pub struct GraphAdjList { pub struct GraphAdjList {
// 邻接表key顶点value该顶点的所有邻接顶点 // 邻接表key顶点value该顶点的所有邻接顶点
pub adj_list: HashMap<Vertex, Vec<Vertex>>, pub adj_list: HashMap<Vertex, Vec<Vertex>>, // maybe HashSet<Vertex> for value part is better?
} }
impl GraphAdjList { impl GraphAdjList {
@ -38,31 +38,27 @@ impl GraphAdjList {
/* 添加边 */ /* 添加边 */
pub fn add_edge(&mut self, vet1: Vertex, vet2: Vertex) { 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"); panic!("value error");
} }
// 添加边 vet1 - vet2 // 添加边 vet1 - vet2
self.adj_list.get_mut(&vet1).unwrap().push(vet2); self.adj_list.entry(vet1).or_default().push(vet2);
self.adj_list.get_mut(&vet2).unwrap().push(vet1); self.adj_list.entry(vet2).or_default().push(vet1);
} }
/* 删除边 */ /* 删除边 */
#[allow(unused)] #[allow(unused)]
pub fn remove_edge(&mut self, vet1: Vertex, vet2: Vertex) { 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"); panic!("value error");
} }
// 删除边 vet1 - vet2 // 删除边 vet1 - vet2
self.adj_list self.adj_list
.get_mut(&vet1) .entry(vet1)
.unwrap() .and_modify(|v| v.retain(|&e| e != vet2));
.retain(|&vet| vet != vet2);
self.adj_list self.adj_list
.get_mut(&vet2) .entry(vet2)
.unwrap() .and_modify(|v| v.retain(|&e| e != vet1));
.retain(|&vet| vet != vet1);
} }
/* 添加顶点 */ /* 添加顶点 */
@ -77,9 +73,6 @@ impl GraphAdjList {
/* 删除顶点 */ /* 删除顶点 */
#[allow(unused)] #[allow(unused)]
pub fn remove_vertex(&mut self, vet: Vertex) { pub fn remove_vertex(&mut self, vet: Vertex) {
if !self.adj_list.contains_key(&vet) {
panic!("value error");
}
// 在邻接表中删除顶点 vet 对应的链表 // 在邻接表中删除顶点 vet 对应的链表
self.adj_list.remove(&vet); self.adj_list.remove(&vet);
// 遍历其他顶点的链表,删除所有包含 vet 的边 // 遍历其他顶点的链表,删除所有包含 vet 的边

View File

@ -45,7 +45,7 @@ impl GraphAdjMat {
// 在邻接矩阵中添加一行 // 在邻接矩阵中添加一行
self.adj_mat.push(vec![0; n]); 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); row.push(0);
} }
} }
@ -60,7 +60,7 @@ impl GraphAdjMat {
// 在邻接矩阵中删除索引 index 的行 // 在邻接矩阵中删除索引 index 的行
self.adj_mat.remove(index); self.adj_mat.remove(index);
// 在邻接矩阵中删除索引 index 的列 // 在邻接矩阵中删除索引 index 的列
for row in &mut self.adj_mat { for row in self.adj_mat.iter_mut() {
row.remove(index); row.remove(index);
} }
} }

View File

@ -22,8 +22,7 @@ fn graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {
let mut que = VecDeque::new(); let mut que = VecDeque::new();
que.push_back(start_vet); que.push_back(start_vet);
// 以顶点 vet 为起点,循环直至访问完所有顶点 // 以顶点 vet 为起点,循环直至访问完所有顶点
while !que.is_empty() { while let Some(vet) = que.pop_front() {
let vet = que.pop_front().unwrap(); // 队首顶点出队
res.push(vet); // 记录访问顶点 res.push(vet); // 记录访问顶点
// 遍历该顶点的所有邻接顶点 // 遍历该顶点的所有邻接顶点