检测图形中的循环

时间:2017-03-30 23:18:41

标签: python dictionary graph

如果有循环,我希望它返回true,如果没有则返回false。如果每个节点只有一个边...

例如:

walkways_info = """\
U 3
0 1
1 2
2 0
"""'

print(interesting_path_feasible(walkways_info))

但是当每个节点有多个边时,它不起作用,因为字典不包含多个值。

例如:

walkways_info = """\
U 7
1 2
1 5
1 6
2 3
2 5
3 4
4 5
"""

我该如何解决这个问题? 在此先感谢:)

def interesting_path_feasible(walkways_info_str):
    """Determines if a cycle exists"""
    graph_dict = dict(e.split(' ') for e in walkways_info_str.splitlines())
    visited = set()
    path = [object()]
    path_set = set(path)
    stack = [iter(graph_dict)]
    while stack:
        for node in stack[-1]:
            if node in path_set:
                return True
            elif node not in visited:
                visited.add(node)
                path.append(node)
                path_set.add(node)
                stack.append(iter(graph_dict.get(node, ())))
                break
        else:
            path_set.remove(path.pop())
            stack.pop()
    return False 

1 个答案:

答案 0 :(得分:2)

将值设为列表,例如

a["abc"] = [1, 2, "bob"]

有几种方法可以为key添加值,并创建一个列表(如果尚未存在的话)。我将在几步之内展示一种这样的方法。

key = "somekey" 
a.setdefault(key, []) 
a[key].append(1)

结果:

a {'somekey': [1]}

接下来,尝试:

key = "somekey"
a.setdefault(key, [])
a[key].append(2)

结果:

a {'somekey': [1, 2]}

setdefault的神奇之处在于,如果未定义该键,则初始化该键的值,否则它不执行任何操作。现在,注意到setdefault返回密钥,您可以将它们组合成一行:

a.setdefault("somekey",[]).append("bob")

结果:

a {'somekey': [1, 2, 'bob']}