Простейший способ его представления (на мой взгляд) - использование набора массивов списков:
graph = {}
graph[node_id] = [other_node_id for other_node_id in neighbors(node_id)]
Простой способ найти циклы - использовать поиск BF или DF:
def df(node):
if visited(node):
pass # found a cycle here, do something with it
visit(node)
[df(node_id) for node_id in graph[node]]
Отказ от ответственности: на самом деле это эскиз; neighbors()
, visited()
и visit()
- просто фиктивные элементы, представляющие, как должен выглядеть алгоритм.