在无向图中如何定义祖先和后代?
Posted
技术标签:
【中文标题】在无向图中如何定义祖先和后代?【英文标题】:How are ancestors and descendants defined in an undirected graph? 【发布时间】:2021-08-12 16:56:26 【问题描述】:我找到了一个祖先的this definition 和一个后代的this definition。 它们看起来很有意义,但不幸的是只适用于有根的树。
我还找到了一个非正式的definition for DAGs。
但是,我感兴趣的是无向图的祖先和后代的正式定义。
【问题讨论】:
【参考方案1】:-
将图形拆分为 1 个或多个连通分量。
在每个组件中选择任意一个节点作为根。
生成从根到其他顶点的最短路径。
节点的祖先是从根开始的路径上的前一个节点
节点后代是从根开始在其路径上继承它的顶点。
我无法想象这个概念会产生什么非常有用的东西,但它确实存在。问题是根的任意选择。
【讨论】:
嗨@ravenspoint!这是一个非常有趣的定义!你从哪里弄来的? 我将其开发为有向图和树中祖先/后代概念的直接扩展。【参考方案2】:在无向图中,您没有祖先或后代。 由于边没有方向,因此您无法区分某个节点“之前”(祖先)和“之后”(后代)的节点。
让我们比较有向图和无向图。 这是一个有向无环图(有向图的一种特殊类型)
在这个有向图中,边有一个方向。由于它是一个 DAG,因此这些方向会引发排序。换句话说,边缘允许您说“某个节点出现在另一个节点之前”。例如,节点 B 在节点 A 之后,因为有一条边从 A 指向 B。同样你可以说 A 在节点 D 之前,因为 B 在 D 之前,A 在 B 之前。这相当于说 A是 B 和 D 的祖先。反过来说,D 是 A(也是 B)的后代。
这是去掉了方向的相同结构,即无向图。
正如您在此图中看到的那样,边没有方向。因为没有方向,所以无法说“节点 X 在节点 Y 之前”。虽然您可以说节点 A 在 B 之前,但您也可以说节点 B 在节点 A 之前。边不会产生顺序,因为它们没有方向。
正如其他答案所述,您可以在无向图中定义顺序。例如,选择某个节点,例如 D,然后在为您访问的边缘分配方向的同时行走。但是,这只是因为您开始为边缘分配方向。这不在图表本身中。
但是,在无向图中,您拥有的是 connected components。 一个连通分量包含图中通过路径连接的所有节点。 在上面的无向图中,(A, B, C, D, E) 是一个连通分量,(F, G) 是另一个。
【讨论】:
嗨@cherrywoods!为什么无法在无向图上定义这些概念? 我更新了答案,但这个问题对于无向图来说非常重要。顾名思义,在无向图中没有方向。祖先和后代需要方向,因为它们需要有意义地定义“之前”和“之后”的概念。【参考方案3】:我发现了一个有趣的post,它从不同的角度揭示了问题。
引用: “我们可以将无向图视为等效于在节点之间具有双向边的有向图。 当我们追踪一个节点的所有祖先时,我们会沿着路径递归地收集到该节点的节点。如果我们继续递归地收集无向图的双向表示中的节点,那么我们最终将收集图中连接组件中的所有节点,这些节点连接到我们要求祖先的节点。同样的论点也适用于后代。”
考虑到这一点,我们可以确定:
“祖先:在图 G 中具有通往节点的路径的所有节点。” “后代:从图 G 中的节点具有路径的所有节点。”【讨论】:
请注意,这里的祖先和后代的概念折叠为一个概念,即连接节点的概念。祖先和后代的集合总是与上面的定义相等。以上是关于在无向图中如何定义祖先和后代?的主要内容,如果未能解决你的问题,请参考以下文章