我找到了一个简单的算法来查找图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)
答案 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)
是的,这是可能的。 您可以只存储每个顶点的父节点,然后迭代父节点数组(直到到达起始顶点),以便在找到循环时打印循环。