在有向图上查找关联的源和目标

时间:2011-12-13 19:54:08

标签: algorithm graph-theory

背景: 我有一个节点集合,代表产品在流程中的交集。这些节点连接在一起成为有向图。有几个独立的图表,因为产品并不总是相交。

产品将始终从初始源节点开始,一个没有父节点。它最终将终止于最终目标节点,一个没有子节点。初始源可以具有一个或多个最终目的地,并且最终目的地可以具有一个或多个初始源。

我们能够编制所需初始源列表,以遵循用户给出的一组标准。这些来源可能(但不一定)属于同一图表。

目标: 鉴于这个初始源列表,我需要能够确定哪些初始源与哪个最终目的地相对应。这些源和目标必须按图表分组,不能重复。换句话说:

  1. 将每个节点与其唯一图表相关联。
  2. 确定属于每个图表的初始来源。
  3. 确定属于每个图表的最终目的地。
  4. 示例:如果我的初始来源列表是1,2,3,4,5,6,7和8,我会得到以下结果(我的未知目的地是A, C,D,E,G,K,L):

    1,4,5,6 -> A,G,K
    2 -> C
    3 -> D,E
    7,8 -> L
    

    问题:执行此任务的有效(并且希望最有效)算法是什么?

    当前解决方案,仅供参考:

    For each initial source:
        If we have not visited the initial source yet
            Mark as belonging to a new graph
    
            Add childrens to a list of nodes to visit.        
    
            For each node to visit:
                If we have not visited this node yet:
                    Mark as belonging to current graph
    
                    If there are no children
                        add to list of final destinations
                    End if
    
                    add all parents and all children to a list of nodes to visit
                End if
            Do next node
        End if
    Do next source
    

    显然,由于我们要访问所有的孩子以及每个节点的所有父母,因为我们将会对我们之前已经看过的节点进行大量访问,因此会有一些额外的开销。

1 个答案:

答案 0 :(得分:3)

您描述的算法是Depth First Search。遵循非循环有向图的这类问题可能由Breadth First Search更好地处理。即使图表不是非循环的,这仍然是一种更好的方法。