def test_remove_range(self): t = Vector() t.copyFrom([0, 1, 2, 3, 4, 5, 6], 0, 7) t.remove_range(3, 5) self.assertEqual(t[:], [0, 1, 2, 5, 6]) t.remove(0) self.assertEqual(t[:], [1, 2, 5, 6])
class GraphMatrix: # 基于向量,邻接矩阵实现图 def __init__(self): self.n = 0 # 顶点数 self.e = 0 # 边数 self.__V = Vector() # 顶点集合 self.__E = Vector() # 边集合 def reset(self): for i in range(self.n): self.vertex(i).status = VStatus.UNDISCOVERED self.vertex(i).dTime = -1 self.vertex(i).fTime = -1 self.vertex(i).parent = -1 self.vertex(i).priority = float('inf') for j in range(self.n): if self.exists(i, j): self.__E[i][j].type = EType.UNDETERMINED def vertex(self, i): return self.__V[i] def vertex_data(self, i): return self.__V[i].data def inDegree(self, i): return self.__V[i].InDegree def outDegree(self, i): return self.__V[i].outDegree def firstNbr(self, i): return self.nextNbr(i, self.n) def nextNbr(self, i, j): for j in range(j - 1, 0, -1): if self.exists(i, j): return j return -1 def exists(self, i, j): # i到j的边是否存在 return 0 <= i <= self.n and 0 <= j <= self.n and self.__E[i][ j] is not None def status(self, i): return self.__V[i].status def dTime(self, i): return self.__V[i].dTime def fTime(self, i): return self.__V[i].fTime def parent(self, i): return self.__V[i].parent def priority(self, i): return self.__V[i].priority def insertV(self, vertex: Vertex): # 插入顶点 for j in range(self.n): self.__E[j].insert(None) # 各顶点增加一个边记录位置 self.n += 1 self.__E.insert(self.n, Vector().copyFrom([None] * self.n, 0, self.n)) # 增加新的顶点向量 return self.__V.insert(self.n, vertex) # 增加新顶点 def removeV(self, i): # 删除第i个顶点及其关联的边 for j in range(self.n): # 所有出边 if self.exists(i, j): # 存在 self.__E[i][j] = None # 删除出边,可选,后续删除整条边 self.__V[j].inDegree -= 1 # 顶点J入度-1 self.__E.remove(i) # 删除i的边数据 self.n -= 1 vBak = self.vertex(i) # 需要删除的顶点备份 self.__V.remove(i) # 删除顶点 for j in range(self.n): if not self.__E[j][i] is None: # 判断第j的顶点是否有到i的边 self.__E[j][i] = None # 有边时删除 self.__V[j].outDegree -= 1 # 出度减1 return vBak def type(self, i, j): return self.__E[i][j].etype def edge(self, i, j): # 方便后续程序修改值,将边对象直接返回 return self.__E[i][j] def edge_data(self, i, j): return self.__E[i][j].data def weight(self, i, j): return self.__E[i][j].weight def insertE(self, edge: Edge, i, j): # 插入i到j的边 if self.exists(i, j): return # 边存在则不做任何处理) self.__E[i][j] = edge self.e += 1 self.__V[i].outDegree += 1 self.__V[j].inDegree += 1 def removeE(self, i, j): # 移除i到j的边 eBak = self.edge(i, j) self.__E[i][j] = None self.e -= 1 self.__V[i].outDegree -= 1 self.__V[j].inDegree -= 1 return eBak def __getitem__(self, item: int): return self.__V[item]