在图表实现中查找所有周期

时间:2016-11-27 20:36:33

标签: python algorithm graph directed-graph

我找到了一个简单的算法来查找图here中的所有周期。我也需要打印循环,这个算法是否可行。请在下面找到代码。

我正确地获得了周期数!

node1,node2是整数。访问是一本字典

def dfs(self,node1, node2):
    if self.visited[node2]:
        if(node1 == node2):
            self.count += 1
            print node2
        return

    self.visited[node2] = True

    for x in self.adj_lst[node2-1]:
        self.dfs(node1, x)

    self.visited[node2] = False

def allCycles(self):
    self.count = 0
    for x in self.VList:
        self.dfs(x.num, x.num)
        self.visited[x.num] = True

    print "Number of cycles: "+str(self.count)

2 个答案:

答案 0 :(得分:3)

是的,你当然可以构建路径,现在你可以递归地进行,但我并不是管理班级临时状态的忠实粉丝。

这是使用stack

的简单实现
def dfs(graph, start, end):
    fringe = [(start, [])]
    while fringe:
        state, path = fringe.pop()
        if path and state == end:
            yield path
            continue
        for next_state in graph[state]:
            if next_state in path:
                continue
            fringe.append((next_state, path+[next_state]))

>>> graph = { 1: [2, 3, 5], 2: [1], 3: [1], 4: [2], 5: [2] }
>>> cycles = [[node]+path  for node in graph for path in dfs(graph, node, node)]
>>> len(cycles)
7
>>> cycles
[[1, 5, 2, 1], [1, 3, 1], [1, 2, 1], [2, 1, 5, 2], [2, 1, 2], [3, 1, 3], [5, 2, 1, 5]]

注意:4无法恢复原状。

答案 1 :(得分:0)

是的,这是可能的。 您可以只存储每个顶点的父节点,然后迭代父节点数组(直到到达起始顶点),以便在找到循环时打印循环。