예제 #1
0
def DFSIterative(vertex: Vertex, queue: BasicQueue, cache: VectorArray,
                 invertedVertexes: VectorArray):
    currentVertex = vertex
    vertex.passed = True

    queue.enqueue(vertex.index)
    stack = BasicStack()
    stack.push(Node(None))
    stack.push(Node(currentVertex.index))

    cache.add(vertex.index)

    while True:
        for bindedVertex in currentVertex.bindedVertexes:
            if cache.getIndexByValue(bindedVertex.index) is not None:
                continue
            else:
                cache.add(bindedVertex.index)
                queue.enqueue(bindedVertex.index)
                stack.push(Node(bindedVertex.index))
                bindedVertex.passed = True
        stackValue = stack.pop().getItem()
        if stackValue is None:
            return
        currentVertex = invertedVertexes[stackValue]
예제 #2
0
def DFS2Iterative(
    vertexIndex: int,
    components: Dictionary,
    component_index: int,
    vertexes: VectorArray,
    cache: SingleArray,
):
    currentVertex = vertexes[vertexIndex]
    stack = BasicStack()
    stack.push(Node(None))
    stack.push(Node(vertexIndex))
    cache.add(vertexIndex)

    while True:
        components.insert(component_index, currentVertex.index)
        for u in currentVertex.bindedVertexes:
            if components[u.index] is not None \
                    or cache.getIndexByValue(u.index) is not None:
                continue
            else:
                cache.add(u.index)
                stack.push(Node(u.index))
                components.insert(component_index, u.index)
        stackValue = stack.pop().getItem()
        if stackValue is None:
            return
        currentVertex = vertexes[stackValue]
예제 #3
0
def DFS(vertex: Vertex, stack: BasicStack):
    vertex.color = 'g'
    for u in vertex.bindedVertexes:
        if u.color == 'w':
            if not DFS(u, stack):
                return False
        elif u.color == 'g':
            return False
    vertex.color = 'b'
    stack.push(Node(vertex.index))
    return True
예제 #4
0
def tarjan(vertexIndexes: []):
    # Создаём из входного массива вектор смежности
    adjacencyVector = AdjacencyVector(len(vertexIndexes))
    vertexes = makeVertexesArray(vertexIndexes, adjacencyVector)
    stack = BasicStack()

    for vertex in vertexes:
        if vertex.color == 'w':
            if not DFS(vertex, stack):
                return False

    return stack.convertToArray()
 def test_stack(self):
     stack = BasicStack()
     stack.push("John")
     stack.push("Alex")
     stack.push("Irina")
     while stack.isEmpty() is not True:
         print(stack.pop())
예제 #6
0
def cosarayuIterative(vertexIndexes: []):
    adjacencyVector = makeAdjacencyVector(vertexIndexes)
    vertexes = makeVertexesArray(vertexIndexes, adjacencyVector)

    invertedVector = adjacencyVector.getInvertedVector()
    invertedVertexes = deepcopy(vertexes)

    for rowVertexIndex, rowBindedVertexIndexes in enumerate(
            invertedVector.vector):
        invertedVertexes[rowVertexIndex].clearBindedIndexes()
        for bindedVertexIndex in rowBindedVertexIndexes:
            invertedVertexes[rowVertexIndex].addBindedVertex(
                invertedVertexes[bindedVertexIndex])

    components = Dictionary()
    compVertexesQueue = BasicQueue()
    compVertexesStack = BasicStack()

    invertedMatrix = adjacencyVector.getInvertedVector()

    for rowVertexIndex, rowBindedVertexIndexes in enumerate(
            invertedMatrix.vector):
        invertedVertexes[rowVertexIndex].clearBindedIndexes()
        for bindedVertexIndex in rowBindedVertexIndexes:
            invertedVertexes[rowVertexIndex].addBindedVertex(
                invertedVertexes[bindedVertexIndex])

    invertedVertexes[0].passed = True

    cache = VectorArray()

    for rowVertexIndex, rowBindedVertexIndexes in enumerate(
            invertedMatrix.vector):
        indexCachedVertex = cache.getIndexByValue(rowVertexIndex)
        if indexCachedVertex is not None:
            continue
        cache.add(invertedVertexes[rowVertexIndex].index)
        compVertexesQueue.enqueue(rowVertexIndex)

        for vertexIndex in rowBindedVertexIndexes:
            cachedVertex = cache.getIndexByValue(vertexIndex)
            if cachedVertex is not None:
                continue
            vertex = invertedVertexes[vertexIndex]
            if vertex.passed is False:
                DFSIterative(vertex, compVertexesQueue, cache,
                             invertedVertexes)
        while not compVertexesQueue.isEmpty():
            compVertexesStack.push(compVertexesQueue.dequeue())

    component_index = 0
    cache = SingleArray()

    while not compVertexesStack.isEmpty():
        vertexIndex = compVertexesStack.pop()
        if components[vertexIndex] is None:
            DFS2Iterative(vertexIndex, components, component_index, vertexes,
                          cache)
            component_index += 1

    return components.get_all()
예제 #7
0
def cosarayu(vertexIndexes: []):
    # Создаём из входного массива вектор смежности
    adjacencyVector = makeAdjacencyVector(vertexIndexes)

    # Создаём из вектора смежности массив вершин, связываем вершины друг с другом
    vertexes = makeVertexesArray(vertexIndexes, adjacencyVector)

    # Создаём инвертированный вектор смежности
    invertedVector = adjacencyVector.getInvertedVector()

    # Копируем массив вершин и меняем связи между вершинами
    # в соответствии с инвертированным вектором смежности
    invertedVertexes = deepcopy(vertexes)

    for masterVertexIndex, slaveVertexIndexes in enumerate(
            invertedVector.vector):
        invertedVertexes[masterVertexIndex].clearBindedIndexes()
        for slaveVertexIndex in slaveVertexIndexes:
            invertedVertexes[masterVertexIndex].addBindedVertex(
                invertedVertexes[slaveVertexIndex])

    # Словарь для хранения вершин компонентов
    # Ключ - индекс вершины,
    # Значение - номер компонента
    components = Dictionary()

    # Очередь для хранения вершин одной компоненты связности
    compVertexesQueue = BasicQueue()

    # Стек для хранения вершин, упорядоченных по принадлежности к компонентам,
    # который мы будем проходить снизу вверх, заполняя массив components
    compVertexesStack = BasicStack()

    # Первая вершина считается пройденной
    invertedVertexes[0].passed = True

    # Проходим каждую вершину и связанные с ней вершины
    for masterVertexIndex, slaveVertexIndexes in enumerate(
            invertedVector.vector):
        for vertexIndex in slaveVertexIndexes:
            vertex = invertedVertexes[vertexIndex]

            # Если вершина ещё не пройдена,
            # то запускаем процедуру поиска в глубину
            if vertex.passed is False:
                DFS1(vertex, compVertexesQueue)

        if not compVertexesQueue.isEmpty() \
            and not compVertexesQueue.isValueExists(masterVertexIndex):
            compVertexesQueue.enqueue(masterVertexIndex)

        # Если временная очередь не пуста,
        # то надо добавить её содержимое в стек для хранения вершин
        while not compVertexesQueue.isEmpty():
            compVertexesStack.push(compVertexesQueue.dequeue())

    component_index = 0

    while not compVertexesStack.isEmpty():
        vertexIndex = compVertexesStack.pop()
        if components[vertexIndex] is None:
            DFS2(vertexIndex, components, component_index, vertexes)
            component_index += 1

    return components.get_all()