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 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 test_queue(self): queue = BasicQueue() queue.enqueue("John") queue.enqueue("Alex") queue.enqueue("Irina") while queue.isEmpty() is not True: print(queue.dequeue())
class LinkedArray(): def __init__(self): self._size = 0 self._queue = BasicQueue() def size(self): return self._size def add(self, item): self._queue.enqueue(item) self._size += 1 def get(self, index: int): if index >= self._size: return None curr = self._queue.getHead() for j in range(index): curr = curr.getNext() return curr.getItem()
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()
def __init__(self): self._size = 0 self._queue = BasicQueue()