def DFS1(vertex: Vertex, queue: BasicQueue): vertex.passed = True for bindedVertex in vertex.bindedVertexes: if bindedVertex.passed is False: DFS1(bindedVertex, queue) if not queue.isValueExists(vertex.index): queue.enqueue(vertex.index)
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()