使用 DFS 算法对有向图和无向图进行拓扑排序
Topological sort on directed and undirected graphs using DFS algorithm
我可以使用 DFS 算法确定有向图的拓扑排序。如果没有循环,我假设我找到的拓扑顺序是有效的。如果有一个循环,我认为拓扑顺序是无用的。到目前为止我是否正确?
无向图呢? "topological sort of an undirected graph" 是一个有效的陈述吗?拓扑排序的图一定要是有向无环图吗?
很难确定无向图的拓扑排序意味着什么或看起来像什么。有向图的拓扑排序是对于图中的每条边 (u, v),u 出现在 v 之前的顺序中。如果有向图,则边 (u, v) 和 (v, u)彼此不相同,边缘有明确的起点和终点。
然而,在无向图中,边没有起点和终点——节点要么相互相邻,要么相互不相邻。那么拓扑排序会是什么样子呢?给定边 {u, v} = {v, u},哪个节点必须在顺序中排在第一位是不明确的,因为没有一个节点比另一个节点占据特权位置。
在这种情况下,最接近您想要的顺序是从此类图形的“叶子”到图形的质心。这意味着排序中最右边的项目(或堆栈的顶部)与图中任何其他节点的高度(即距离)最小。
为此,您可以使用 Kahn 算法的修改版。不是从 0 个入度顶点开始,而是从所有具有 1 个入度顶点的叶子开始。请记住,在无向图中,所有节点的边都是双向的,因此不可能有 0 入度顶点。然后你删除所有 1 个入度顶点,推送到你的堆栈,更新其他的入度顶点并重复直到图中的所有顶点都被添加到你的堆栈中。
在这里使用 DFS 没有意义,因为您的结果会根据您选择的图中源顶点的顺序而有所不同。
我可以使用 DFS 算法确定有向图的拓扑排序。如果没有循环,我假设我找到的拓扑顺序是有效的。如果有一个循环,我认为拓扑顺序是无用的。到目前为止我是否正确?
无向图呢? "topological sort of an undirected graph" 是一个有效的陈述吗?拓扑排序的图一定要是有向无环图吗?
很难确定无向图的拓扑排序意味着什么或看起来像什么。有向图的拓扑排序是对于图中的每条边 (u, v),u 出现在 v 之前的顺序中。如果有向图,则边 (u, v) 和 (v, u)彼此不相同,边缘有明确的起点和终点。
然而,在无向图中,边没有起点和终点——节点要么相互相邻,要么相互不相邻。那么拓扑排序会是什么样子呢?给定边 {u, v} = {v, u},哪个节点必须在顺序中排在第一位是不明确的,因为没有一个节点比另一个节点占据特权位置。
在这种情况下,最接近您想要的顺序是从此类图形的“叶子”到图形的质心。这意味着排序中最右边的项目(或堆栈的顶部)与图中任何其他节点的高度(即距离)最小。 为此,您可以使用 Kahn 算法的修改版。不是从 0 个入度顶点开始,而是从所有具有 1 个入度顶点的叶子开始。请记住,在无向图中,所有节点的边都是双向的,因此不可能有 0 入度顶点。然后你删除所有 1 个入度顶点,推送到你的堆栈,更新其他的入度顶点并重复直到图中的所有顶点都被添加到你的堆栈中。
在这里使用 DFS 没有意义,因为您的结果会根据您选择的图中源顶点的顺序而有所不同。