我写了一个小函数,它应该在给定(未显示)的图形中找到一个圆圈,如果找到圆圈则返回true,否则返回false。
def dfs(v,last):
if vis[v] == True:
return True
vis[v] = True
c = False
for el in adj[v]:
if el == last:
adj[v].remove(el)
else:
c = c or dfs(el,v)
return c
adjacencylist是一个dict,如下所示:adj ={1: [2], 2: [1,3], 3: [2]}
。
另一个字典是检查结是否已被访问过。 vis = {1: False, 2: False, 3: False}
我遇到的问题是,它似乎适用于示例中的给定列表,但对于其他人,它给了我一个错误的结果(例如:adj = {1: [2,4], 2: [1,5], 4: [1,5], 5:[2,4]}
你能帮我解决这个问题,还是告诉我如何找到解决这个问题的更好方法。我不想导入任何其他模块。
答案 0 :(得分:2)
问题出在remove-statement中。请尝试以下方法:
def dfs(v,last):
if v in vis:
return True
vis.append(v)
c = False
current_adj_list = list(adj[v])
for el in current_adj_list:
if el == last:
adj[el].remove(v)
else:
c = c or dfs(el,v)
return c
adj = {1: [2,4], 2:[1,5,4], 4: [1,2], 5: [2]}
vis = []
print(dfs(1,None))
说明:您正在将当前访问节点的边缘删除到它的后继节点。因此,在循环中,您从同一列表中反复删除相同的元素。 但是,您确实要删除后继者的边缘。因此,
adj[v].remove(el)
成了
adj[el].remove(v)
其次,我们需要用
复制邻接列表current_adj_list = list(adj[v])
因为我们在递归中更深入地编辑列表,改变元素的顺序,从而(可能)在更高的递归级别中破坏循环。