Я новичок в программировании и изучении алгоритмов и изучал BFS, когда прочитал, что BFS можно использовать для обнаружения цикла. Я попытался реализовать то же самое на неориентированном графе G с представлением списка смежности. Я сделал следующее:
• Выполните простой обход BFS с использованием очереди, сохраняя при этом родительский узел узлов, поставленных в очередь в очереди.
• Если я сталкиваюсь с узломu
, у которого есть сосед v
, такой, что v
уже посещен, но v
не является родителем u
, тогда это означает, что в графе есть цикл.
Псевдокод :
#adjList is the adjacency list given as a dictionary
#myQueue is a double-sided queue containing node and its parent node ([Node, parNode])
#visited is a set containing visited nodes
while(myQueue):
currNode, parNode = myQueue.pop() #dequeue operation
visited.add(currNode) #Marking currNode as visited
for childNode in adjList[currNode]: #Traversing through all children of currNode
if currNode not in visited:
myQueue.appendleft([childNode, currNode]) #Enqueue operation
else:
if childNode!=parNode: #Main logic for cycle detection
print('CYCLE DETECTED')
break
Вышеупомянутый подход работает, за исключением случаев, когда у меня есть более 1 ребра между 2 вершинами, например, в следующем случае у нас есть 2 ребра между вершинами 0
и 1
:
Список смежности на приведенном выше графике: adjList = {0:[1, 1, 2], 1:[0, 0], 2:[0]}
. Здесь мы можем ясно видеть, что граф содержит цикл (в представлении списка смежности это подтверждается тем фактом, что 1
дважды появляется в списке смежности 0
и 0
дважды появляется в списке смежности 1
) но алгоритм выше не может обнаружить то же самое, потому что, когда BFS достигнет вершины 1
, вершина 0
уже посещена, но вершина 0
также является родителем вершины 1
, поэтому этот цикл останется незамеченным.
У меня вопрос, как я могу изменить приведенный выше алгоритм для обнаружения таких случаев?
Редактировать : Я пробовал ту же логику и на ориентированных графах, и я столкнулся с аналогичной проблемойто есть, когда у меня есть направленный край от вершины 0
до вершины 1
и другой направленный край от вершины 1
до вершины 0