如何删除评分定向acyclig图中的无效边?

时间:2017-11-16 13:33:53

标签: algorithm graph-theory directed-acyclic-graphs

以下图表示例是有向非循环图的一部分,该图是layered并且已清理,以便仅保留连接连续图层的边

所以我需要的是消除形成“快捷方式”的边缘,即在非连续层之间跳转。

以下注意事项适用:

  1. 蓝色环分层是有效的,因为从83140开始到29518结束,两个分支具有相同数量(3)的中间节点,并且在起始节点和结束节点之间没有更长的路径;
  2. 从94347开始到107263结束的绿色环具有无效边缘(已经红叉),因为左分支仅包含一个中间节点,而右分支包含三个中间节点;此外,由于该分支的第一个边缘已经有效 - 我们知道它与有效的蓝色环相关 - 可以知道哪个是交叉输出的右边缘 - 否则就不可能知道应该分配哪个层到节点94030,所以它应该被删除;
  3. 如果我们在考虑绿色之后考虑粉色环,我们知道要删除较低的红色边缘。
  4. 但是如果我们只考虑 黄色环,那么两个分支似乎都是正确的(它们包含相同数量的内部节点),但实际上它们看似正确,因为它们包含对称错误(快捷方式跳转)两个分支上的节点数量相同)。如果我们在本地获取此环,则至少有一个分支最终会出现错误的层,因此有必要使用更多的全局数据来避免此错误。
  5. enter image description here

    我的问题是:

    1. 该问题的配方和可能的解决方案涉及哪些典型的概念和操作?
    2. 有算法吗?

1 个答案:

答案 0 :(得分:1)

首先,topologically sort图表。

现在从排序数组开始,启动breadth first search并尝试找到正确的"深度" (每个节点的距离)。由于节点可以有多个父节点,因此对于节点xdepth[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发生就删除旧父节点的边缘。很明显)