Пример #1
0
 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])
Пример #2
0
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]