Graph “查找全部”;“树状”;DAG中的顶点

Graph “查找全部”;“树状”;DAG中的顶点,graph,tree,graph-theory,graph-algorithm,directed-acyclic-graphs,Graph,Tree,Graph Theory,Graph Algorithm,Directed Acyclic Graphs,我在寻找一个DAG算法,它可以识别所有顶点,满足给定顶点V的以下要求:从V的任何前导到V的任何后继的所有路径都包含顶点V。这包括直接和间接前导和后继 输入DAG,将始终有一个根并将连接 我认为根和叶满足上述要求,有一组空的路径,“所有路径”包含您想要的任何内容:)。在任何情况下,找到这些都是微不足道的 注意:如果DAG是一个多边形树,则结果包含所有顶点 例如,在下面的DAG(所有边都指向下方)中,我想找到所有顶点,它们都用大写字母标记 (A) / | \ b |

我在寻找一个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) (A) / | \ b|\ / | | \ c(J)r\ |/(K) | / / \ |/ / \ (D) l o | \ \ / \ |\\/(P) e h(M)\ |/\\(Q) |/(I)(N) (F) | (G) | (H)
有什么想法吗?这个问题有名字吗?

我认为检查顶点V,例如V的平均邻接度为零,应该是你问题的一个很好的起点

如果V的平均邻域度为零,则V的任何邻域之间都没有相互连接的路径。因为在下面的函数中,V的后继S和前导P都被算作它的邻居,所以P和S之间的路径将包含V

注意:这并不保证V的唯一性,即p和S之间的路径可能包含其他节点U。这对您合适吗?如果后继节点不能连接到V的其他后继节点,并且类似地,前继节点不能连接到V的其他前继节点,则我的答案有效

也指继任者和前任,您是指直接继任者/前任吗?我不确定我的技术是否适用于非直接的,但如果直接的,它们之间没有连接,平均相邻度应该有效

因为您提到了DAG,所以您已经有了一个有向图数据结构,因此在该数据结构上运行平均邻接度应该可以

NetworkX是我最熟悉的库,因此我将使用以下函数:

通过上面的函数,可以指定图形中要分析的节点。因此,为它提供节点V和所有S和P节点。它应该返回所有节点的平均邻居度。从dict中提取节点V的值并检查它是否为零

如果没有来自您这边的一些代码或示例数据结构,将很难进一步帮助您。如果你能给我提供一些起始代码,我可以用一些NetworkX代码来更新这个答案,DAG is,后一种方法更容易用偏序集术语来描述

因为DAG是根的,所以它相当于用根更改“任何前置”

如果顶点B有多个直接前置。称它们为B1,B2,…,Bk。设置A=B1,B2,…,Bk的值。自从DAG生根以来,它一直存在。A 算法的概要与上面的描述相同:

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
solution\u set=所有顶点
对于具有更多传入边的顶点B
(a) 查找联接(B1、B2、…、Bk)
(b) 从溶液组中移除所有V,A
线a和b的实现可以通过存储每个顶点的前导来完成。可以通过以下方式找到。设P(v)是顶点v的所有前导的集合

行a的实现方式如下。设I为P(B1),P(B2),…,P(Bk)的交点。找到I中的最大顶点,该顶点只能通过I中的一条路径从根到达。这是通过从根遍历并查看最后一条路径顶点的后续顶点是否在I中来完成的


b行只是p(b)-p(A)-A。

谢谢。但我认为这不会奏效。正如你所说的,如果间接继承人/前任受到质疑,这是行不通的,而这正是我要问的。将编辑问题以粗体显示此部分。