Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 9 additions & 16 deletions codes/rust/chapter_graph/graph_adjacency_list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ use std::collections::HashMap;
/* 基于邻接表实现的无向图类型 */
pub struct GraphAdjList {
// 邻接表,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 {
Expand All @@ -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));
}

/* 添加顶点 */
Expand All @@ -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 的边
Expand Down
4 changes: 2 additions & 2 deletions codes/rust/chapter_graph/graph_adjacency_matrix.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Expand All @@ -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);
}
}
Expand Down
3 changes: 1 addition & 2 deletions codes/rust/chapter_graph/graph_bfs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,7 @@ fn graph_bfs(graph: GraphAdjList, start_vet: Vertex) -> Vec<Vertex> {
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); // 记录访问顶点

// 遍历该顶点的所有邻接顶点
Expand Down
Loading