【问题标题】:Traversal directed graph with cycles带循环的遍历有向图
【发布时间】:2018-03-27 13:29:03
【问题描述】:

我编写了一个脚本来使用 python 中的 networkx 构造一个有向图,我想获取从开始到结束的所有可能路径,包括循环。 例如,有一个有向图:

我想得到这些路径:

A->B->D

A->B->C->D

A->B->C->B->D

A->B->C->B->C->B->D

...

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

有什么算法可以实现吗?

非常感谢

【问题讨论】:

  • 这样的路数不胜数,你有耐心等他们吗?
  • @n.m.是的。我可以在python中使用“yield”,然后我可以一个一个地得到路径

标签: algorithm graph-algorithm directed-graph


【解决方案1】:

如前所述,这样的路径数不胜数。

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

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

假设路径始终存在,该方法有效。如果在n-1 步骤中没有找到路径,其中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 列表在最坏的情况下会呈指数级增长(想想如果您在完整的图表上运行它会发生什么)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多