我正在寻找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)
有什么想法吗?这个问题有名字吗?
答案 0 :(得分:0)
我相信检查一个顶点V,使得V的平均邻居度为零,应该是你问题的一个很好的起点。
如果V的平均邻居度为零,则V的任何邻居之间没有彼此之间的路径。由于后继S和前任P都是V在下面的函数中被计为其邻居,因此P和S之间的路径将包含V。
注意:这并不保证V的唯一性,即P和S之间的路径可能包括其他节点U.这对你好吗?如果后继节点不能连接到V的其他后继节点,我的答案是有效的,同样,前任节点也不能连接到V的其他前任节点。
还有接班人和前辈,你的意思是IMMEDIATE接班人/前任吗?我不确定我的技术是否适用于非直接的技术,但如果它们之间没有联系,那么平均邻居程度应该有效。
由于你提到了DAG,你已经有了一个定向图数据结构,因此在这个数据结构上运行平均邻居度应该没问题。
NetworkX是我最熟悉的库,所以这是我将使用的功能:
上述功能允许您指定图形中要分析的节点。因此,为节点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.