以下图表示例是有向非循环图的一部分,该图是layered并且已清理,以便仅保留连接连续图层的边。
所以我需要的是消除形成“快捷方式”的边缘,即在非连续层之间跳转。
以下注意事项适用:
我的问题是:
答案 0 :(得分:1)
首先,topologically sort图表。
现在从排序数组开始,启动breadth first search并尝试找到正确的"深度" (每个节点的距离)。由于节点可以有多个父节点,因此对于节点x
,depth[x]
是其所有父节点的最大深度加一。我们将所有节点的depth
初始化为-1
。
现在在bfs遍历中,当我们遇到节点p
时,我们会尝试更新其所有孩子c
的深度,其中depth[c] = max(depth[c],depth[p]+1)
。现在有两种方法可以检测出具有快捷方式的孩子。
depth[p]+1 < depth[c]
,则表示c
的父级深度高于p
。因此edge p to c
必须是捷径。depth[p]+1 > depth[c]
和depth[c]!=-1
,则表示c
的父级深度低于p
。因此,p
是更好的父级,而c
的其他父级必须拥有p
的快捷方式。在这两种情况下,我们都将c
标记为有问题。
现在我们的目标是解决每一个问题&#39;节点x
,我们检查它的所有父级,其深度应为depth[x]-1
。如果其中任何一个的深度低于该深度,则该深度具有需要移除的x
的快捷边缘。
由于图表可以有多个根,因此我们应该有一个变量来标记visited
个节点,并对未经访问的任何节点重复上述内容。
这将对黄色环问题进行排序,因为在我们访问任何节点之前,所有它的前辈都已经被访问过且排名正确。这是通过拓扑排序确保的。
(注意:我们可以通过一次传递完成此操作。我们可以为所有节点维护parent
变量,而不是标记有问题的节点,并且只要情况2发生就删除旧父节点的边缘。很明显)