defadd_vertex(self, val: int): """添加顶点""" n = self.size() # 向顶点列表中添加新顶点的值 self.vertices.append(val) # 在邻接矩阵中添加一行 new_row = [0] * n self.adj_mat.append(new_row) # 在邻接矩阵中添加一列 for row inself.adj_mat: row.append(0)
defremove_vertex(self, index: int): """删除顶点""" if index >= self.size(): raise IndexError() # 在顶点列表中移除索引 index 的顶点 self.vertices.pop(index) # 在邻接矩阵中删除索引 index 的行 self.adj_mat.pop(index) # 在邻接矩阵中删除索引 index 的列 for row inself.adj_mat: row.pop(index)
defadd_edge(self, i: int, j: int): """添加边""" # 参数 i, j 对应 vertices 元素索引 # 索引越界与相等处理 if i < 0or j < 0or i >= self.size() or j >= self.size() or i == j: raise IndexError() # 在无向图中,邻接矩阵关于主对角线对称,即满足 (i, j) == (j, i) self.adj_mat[i][j] = 1 self.adj_mat[j][i] = 1
defremove_edge(self, i: int, j: int): """删除边""" # 参数 i, j 对应 vertices 元素索引 # 索引越界与相等处理 if i < 0or j < 0or i >= self.size() or j >= self.size() or i == j: raise IndexError() self.adj_mat[i][j] = 0 self.adj_mat[j][i] = 0
defadd_edge(self, vet1: Vertex, vet2: Vertex): """添加边""" if vet1 notinself.adj_list or vet2 notinself.adj_list or vet1 == vet2: raise ValueError() # 添加边 vet1 - vet2 self.adj_list[vet1].append(vet2) self.adj_list[vet2].append(vet1)
defremove_edge(self, vet1: Vertex, vet2: Vertex): """删除边""" if vet1 notinself.adj_list or vet2 notinself.adj_list or vet1 == vet2: raise ValueError() # 删除边 vet1 - vet2 self.adj_list[vet1].remove(vet2) self.adj_list[vet2].remove(vet1)
defadd_vertex(self, vet: Vertex): """添加顶点""" if vet inself.adj_list: return # 在邻接表中添加一个新链表 self.adj_list[vet] = []
defremove_vertex(self, vet: Vertex): """删除顶点""" if vet notinself.adj_list: raise ValueError() # 在邻接表中删除顶点 vet 对应的链表 self.adj_list.pop(vet) # 遍历其他顶点的链表,删除所有包含 vet 的边 for vertex inself.adj_list: if vet inself.adj_list[vertex]: self.adj_list[vertex].remove(vet)
defprint(self): """打印邻接表""" print("邻接表 =") for vertex inself.adj_list: tmp = [v.val for v inself.adj_list[vertex]] print(f"{vertex.val}: {tmp},")