带循环的遍历有向图

时间:2018-03-27 13:29:03

标签: algorithm graph-algorithm directed-graph

我编写了一个脚本来在python中使用networkx构建有向图,我希望从头到尾获得所有可能的路径,包括循环。 例如,有一个有向图: enter image description here

我想获得这些路径:

A-> B-> d

A-> B-> C-> d

A-> B-> C-> B-> d

A-> B-> C-> B-> C-> B-> d

...

据我所知,有很多算法可以找到2个节点之间没有循环的最短路径或路径,但我想找到带循环的路径。

有没有算法来实现这个目标?

很多

1 个答案:

答案 0 :(得分:0)

如上所述,存在无限数量的此类路径。

但是,您仍然可以通过维护v中可以从v的起始节点到达的所有节点k(以及您曾经达到k=1,2,...的路径)来以懒惰的方式生成所有节点} v的步骤;如果n-1是您的目标节点,请记住它。

当您必须返回下一条路径时,(i)弹出第一个目标节点离开列表,以及(ii)为列表中的所有非目标节点生成下一个候选节点。如果列表中没有目标节点,请重复(ii)直到找到一个。

假设路径始终存在,该方法可以正常工作。如果您在n步骤中找不到路径,其中class Node { int steps Node prev Node(int steps=0, Node prev=null) { prev = prev steps = steps } } class PathGenerator { Queue<Node> nodes Node start, target; PathGenerator(Node start, Node target) { start = start target = target nodes = new Queue<>() nodes.add(start) // assume start.steps=0 and stat.prev=null } Node nextPath(int n) { current_length = -1; do { node = nodes.poll() current_length = node.steps // expand to all others you can reach from node for each u in node.neighbors() list.add(new Node(node, node.steps+1)) // if node is the target, return the path if (node == target) return node } while (current_length < n); throw new Exception("no path of length <=n exists"); } } 是节点数,则只需报告不存在路径。

这里是一个算法的伪代码,它生成从最短到最长的路径假设单位权重

nodes

请注意,在最坏的情况下,列表%temp%会呈指数级增长(想想如果您在完整的图表上运行会发生什么)。