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