我正在尝试使用深度优先搜索(DFS)构建简单的循环检测算法。该算法的工作方式如下:在某个节点上执行DFS(目前仅假设整个图形已连接),并将当前正在使用的任何节点标记为灰色,如果已完成则标记为黑色。如果当前节点的邻居是灰色的,则退出该功能并打印“ Cycle detection”
这是我的代码,带有一个简单的4节点图
from collections import defaultdict
G = {'F': ['X', 'O'], 'X': ['F', 'F'],'O':[]}
V = set(G.keys())
gray, black = set(), []
def dfs(u):
try:
print('-'*30,"\n",u)
gray.add(u)
for v in G[u]:
if v in gray:
raise ValueError
elif v not in black:
dfs(v)
gray.discard(u)
black.append(u)
except:
return True
if dfs('F'):
print('Cycle detected')
我认为“尝试除外”是可行的,但是没有用。
最后,我知道我可以使用可变变量,例如cycle = [False],如果满足我的条件,可以将其更新为true。我在问如何避免这样做!谢谢!
答案 0 :(得分:0)
算法没有中断。可以修复如下:
除去图案以外的尝试,而将循环替换为adj顶点
for v in G[u]:
if v in gray:
return True
elif v not in black:
if dfs(v):
return True
if中的dfs(v)承担双重职责,打开递归调用并检索其输出。由于此返回位于最外层递归中,并且位于上述return语句之后,因此当最内层递归返回True时,它将自动切断进一步的搜索并返回true。