mirror of
				https://github.com/krahets/hello-algo.git
				synced 2025-10-31 10:26:48 +08:00 
			
		
		
		
	| @ -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 的边 | ||||||
|  | |||||||
| @ -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); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -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); // 记录访问顶点 | ||||||
|  |  | ||||||
|         // 遍历该顶点的所有邻接顶点 |         // 遍历该顶点的所有邻接顶点 | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 rongyi
					rongyi