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]
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]
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
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())
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()
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()