代码之家  ›  专栏  ›  技术社区  ›  Rohan West

深度优先搜索,如何检测钻石依赖关系?

  •  1
  • Rohan West  · 技术社区  · 17 年前

    我想知道是否有人可以提供一些关于如何在对图形执行深度优先搜索时检查菱形依赖关系的指针…我有下面的图形 A -> B, A -> F, B -> C, B-> E, C -> D, E -> D .

    我正在尝试构造一个表示指定图形的容器的hirearchy,但是当我达到菱形依赖时,我不确定该怎么做。例如,在我的图表中, C E 这两个容器都是 B ,当我决定 D ,我需要参考 C E C E 放在一个容器里?

    6 回复  |  直到 10 年前
        1
  •  3
  •   Shea    17 年前

    我发现最容易想到使用颜色的图形算法。

    所有节点都以白色开头。

    正在处理的节点为灰色。

    处理完节点后,将其涂成黑色。

    处理完节点的子节点后,可以将其着色为黑色。

    如果您遇到一个黑色节点,那么您遇到了菱形依赖项。

        2
  •  2
  •   thestoneage rage    17 年前

    Rohan您可以使用深度优先搜索,通过查找交叉或前边缘来检测“钻石DEP”。如果您看一下 depth-first-search 在boost图形库主页上。

    ... else if(颜色[v]=黑色) (u,v)为十字或前缘 ...

        3
  •  0
  •   Shamik    17 年前

    我不知道您是如何定义图的节点的。假设表示节点的一种方法如下所示-

    public interface Node {
                int getValue();
                List<Node> getChildren();
            }
    

    例如,在你的例子中,我们应该从树的底部开始,我们可以看到D有两个parenet,它们来自B。 所以我想说,建立一个图表,它不仅照顾孩子,也照顾父母。然后在一个过程中,找出哪些节点具有多个父节点(如D),以及这些Parenet(C和E)是否具有相同的父节点(B)。

        4
  •  0
  •   sth    17 年前

    我不确定你到底想做什么,但最晚当你的图表包含循环时,你真的需要检测你在搜索过程中反复找到的节点。通常,这是通过在处理节点时以某种方式标记节点来完成的,以便以后可以查看之前是否已经访问过它们。这在您的案例中的效果取决于您的实现以及这些节点的外观。。。

        5
  •  0
  •   Charlie Martin    17 年前

    . 是的,在这种情况下,如果有两个节点的传入边和传出边与相同节点(此处,(B,E),(B,C)(C,D),(E,D))相连,则将两个节点C和E合并为“C,E”节点是合法的。把D分解成D也是合法的 2. 把它变成一棵树而不是一只狗。

    也就是说,这样做是合法的 依靠 关于这个问题。

        6
  •  -1
  •   Arnold Spence    17 年前

    图论是一个非常庞大而复杂的数学领域。这是一件很危险的事情:)即使是图论的基本应用,也很难找到简单的解释。很有可能,任何你可能遇到的图形都被打死了,并且有比你解决问题时想象的多5倍的陷阱和陷阱。

    我猜你会在这里看到一些非常合理的建议,然后过一会儿,他们会被认为是部分错误,甚至大部分错误。小心一点。