找到所有"树状" DAG中的顶点

时间:2018-06-02 13:28:57

标签: graph tree graph-theory graph-algorithm directed-acyclic-graphs

我正在寻找DAG中的算法,该算法将识别所有顶点,满足给定顶点V的以下要求: 所有 路径来自任何 V的前身对任何 V的后继者都包含顶点V.这包括直接间接前辈和后继者。

输入DAG,将始终具有单个根并将连接。

我认为根和叶子满足上面的要求,有一组空的路径和"所有这些"包含你想要的任何东西:)。无论如何,找到那些都是微不足道的。

注意:如果DAG是一个多边形,则结果包含所有顶点。

例如,在下面的DAG中(所有边都指向下方),我想找到所有顶点,用大写字母标记。

         (A) 
        / | \
       b  |  \
     / |  |   \
    c (J) r    \
    |    /     (K)
    |  /      /   \
    |/       /     \
   (D)      l       o
    | \      \     / \
    |  \      \   /  (P) 
    e   h      (M)     \
    |  / \       \     (Q)  
    | /  (I)     (N) 
   (F)               
    |                
   (G)
    |
   (H)

有什么想法吗?这个问题有名字吗?

2 个答案:

答案 0 :(得分:0)

我相信检查一个顶点V,使得V的平均邻居度为零,应该是你问题的一个很好的起点。

如果V的平均邻居度为零,则V的任何邻居之间没有彼此之间的路径。由于后继S和前任P都是V在下面的函数中被计为其邻居,因此P和S之间的路径将包含V。

注意:这并不保证V的唯一性,即P和S之间的路径可能包括其他节点U.这对你好吗?如果后继节点不能连接到V的其他后继节点,我的答案是有效的,同样,前任节点也不能连接到V的其他前任节点。

还有接班人和前辈,你的意思是IMMEDIATE接班人/前任吗?我不确定我的技术是否适用于非直接的技术,但如果它们之间没有联系,那么平均邻居程度应该有效。

由于你提到了DAG,你已经有了一个定向图数据结构,因此在这个数据结构上运行平均邻居度应该没问题。

NetworkX是我最熟悉的库,所以这是我将使用的功能:

https://networkx.github.io/documentation/networkx-1.5/reference/generated/networkx.algorithms.neighbor_degree.average_neighbor_degree.html#networkx.algorithms.neighbor_degree.average_neighbor_degree

上述功能允许您指定图形中要分析的节点。因此,为节点V和所有S和P节点提供信息。它应返回所有节点的平均邻居度数字。从dict中提取节点V的值并检查它是否为零

如果没有您的一些代码或示例数据结构,将很难帮助您。如果你能提供一些启动代码,我可以用一些NetworkX代码更新这个答案

答案 1 :(得分:0)

DAG是partial order set,后一种方法更容易以poset术语描述。

由于DAG是root用户,因此相当于用root更改“任何前任”。

如果顶点B有多个前一个前任。称他们为B1,B2,...,Bk。设置B1,B2,...,Bk的A = join。它已存在,因为DAG已植根。顶点V,A <&lt; V&lt; B(A是V的前身,B是V的后继)不能在解集中。

算法概要与上层描述相同:

solution_set = all vertices
for vertex B that has more incoming edges
   (a) find A join (B1, B2, ..., Bk)
   (b) remove all V, A < V < B, from solution_set

线a和b的实现可以通过存储每个顶点的前驱来完成。这可以通过topological sorting找到。设P(v)设置顶点v的所有前驱。

线路a实现如下。让我成为P(B1),P(B2),...,P(Bk)的交集。在I中找到最大的顶点,只能通过一个在I中的一个路径从根到达。它通过从根遍历并查看最后一个路径顶点的一个后继是否在I中来完成。

线b仅为P(B) - P(A) - A.