在无向图中查找圆

时间:2015-01-24 15:48:17

标签: python-3.x graph find geometry

我写了一个小函数,它应该在给定(未显示)的图形中找到一个圆圈,如果找到圆圈则返回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]} 你能帮我解决这个问题,还是告诉我如何找到解决这个问题的更好方法。我不想导入任何其他模块。

1 个答案:

答案 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])

因为我们在递归中更深入地编辑列表,改变元素的顺序,从而(可能)在更高的递归级别中破坏循环。