如何使用备用路径表示依赖关系图

时间:2014-10-29 23:19:01

标签: algorithm data-structures graph dependencies

我在这种情况下尝试表示和操作依赖图时遇到了一些麻烦:

  • 一个节点有一些必须解决的依赖
  • 每个路径都不能有依赖循环(如DAG图中)
  • 每个依赖项都可以由多个其他节点解决

我从目标节点开始并以递归方式查找其依赖关系,但必须保留上述属性,特别是第三个属性。

这里只是一个小例子:

我想要一张如下图所示的图表

           (A)
          /   \
         /     \
        /       \
  [(B),(C),(D)] (E)
   /\        \
  /  \       (H)
(F)  (G)

表示:

  • F,G,C,H,E没有依赖性
  • D依赖于H
  • B取决于F和G
  • A取决于E
    • B
    • C
    • d

所以,如果我写下所有可能的拓扑排序路径到A,我应该:

  1. E - > F - > G - > B - > A
  2. E - > C - > A
  3. E - > H - > D - > A
  4. 如何使用这些属性建模图形?哪种数据结构更适合这样做?

1 个答案:

答案 0 :(得分:2)

您应该使用具有附加属性的普通邻接列表,其中节点知道其也满足相同依赖性的其他节点。这意味着B,C,D都应该知道它们属于同一个等价类。您可以通过将它们全部插入到集合中来实现此目的。

Node:
    List<Node> adjacencyList
    Set<Node> equivalentDependencies

要在topo-sort中使用此数据结构,每当删除源并删除其所有传出边时,还要删除其等效类中的节点及其传出边,并递归删除指向它们的节点。 来自维基百科:

L ← Empty list that will contain the sorted elements
S ← Set of all nodes with no incoming edges
while S is non-empty do
    remove a node n from S
    add n to tail of L
    for each node o in the equivalency class of n <===removing equivalent dependencies
        remove j from S
            for each node k with an edge e from j to k do
                remove edge e from the graph
                if k has no other incoming edges then
                    insert k into S    
    for each node m with an edge e from n to m do
        remove edge e from the graph
        if m has no other incoming edges then
            insert m into S
if graph has edges then
    return error (graph has at least one cycle)
else 
    return L (a topologically sorted order)

此算法将为您提供经过修改的拓扑排序路径之一。