使用 DFS 算法对有向图和无向图进行拓扑排序

Posted

技术标签:

【中文标题】使用 DFS 算法对有向图和无向图进行拓扑排序【英文标题】:Topological sort on directed and undirected graphs using DFS algorithm 【发布时间】:2018-12-29 20:36:39 【问题描述】:

我可以使用 DFS 算法确定有向图的拓扑排序。如果没有循环,我假设我找到的拓扑顺序是有效的。如果有一个循环,我认为拓扑顺序是无用的。到目前为止我是正确的吗?

无向图呢? “无向图的拓扑排序”是一个有效的陈述吗?图是否必须是有向无环图才能进行拓扑排序?

【问题讨论】:

【参考方案1】:

很难确定无向图的拓扑排序的含义或外观。有向图的拓扑排序是对于图中的每条边 (u, v),u 出现在 v 之前的排序中。如果您有有向图,边 (u, v) 和 (v, u)互不相同,边有明确的起点和终点。

但是,在无向图中,边没有起点和终点——节点要么相互相邻,要么相互不相邻。那么拓扑排序会是什么样子呢?给定一条边 u, v = v, u,哪个节点必须在排序中排在第一位是不明确的,因为两个节点都没有比另一个节点占据特权位置。

【讨论】:

【参考方案2】:

在这种情况下,最接近您想要的顺序是从此类图的“叶子”到图的质心。这意味着排序的最右边的项目(或堆栈的顶部)将具有到图中任何其他节点的最小高度(即距离)。 为此,您可以使用卡恩算法的修改。不是从 0 度顶点开始,而是从所有具有 1 度顶点的叶子开始。请记住,在无向图中,所有节点的边都是双向的,因此不可能有 0 度的顶点。然后删除所有 1 个入度顶点,推送到您的堆栈,更新其他入度顶点并重复,直到图中的所有顶点都已添加到您的堆栈中。

在这里使用 DFS 没有意义,因为您的结果会根据您选择的图中源顶点的顺序而有所不同。

【讨论】:

以上是关于使用 DFS 算法对有向图和无向图进行拓扑排序的主要内容,如果未能解决你的问题,请参考以下文章

判断无向图和有向图是不是有环

算法详解之拓扑排序

图 - 拓扑排序 (二)

拓扑排序

图解:有向环拓扑排序与Kosaraju算法

图论排序---拓扑排序