我正在寻找O(V + E)算法来找到给定DAG 的传递减少。
那就是删除尽可能多的边,这样,如果您可以从u到达v,则对于任意v和u,在去除边之后仍然可以到达。
如果这是标准问题,请向我指出一些模型解决方案。
我正在寻找O(V + E)算法来找到给定DAG 的传递减少。
那就是删除尽可能多的边,这样,如果您可以从u到达v,则对于任意v和u,在去除边之后仍然可以到达。
如果这是标准问题,请向我指出一些模型解决方案。
Answers:
我们可以通过在每个顶点上执行DFS来解决此问题。
上面的总体复杂度是运行 DFS' 的复杂度,即。O (N (N + M ))
不是你想要的。但是仅出于共享知识的目的,如果假设每个顶点都充当处理器,则可以使用消息来实现。注意每个顶点都有一个可比较的值。因此,存在一些顶点,使得它们大于所有邻居。这些顶点执行以下操作:
现在,如果节点从每个更大的邻居接收到一条消息(即包括或不包括所有边缘,则节点行为就好像它是其邻域中最大的一样。前面提到的4个步骤。(v ',v )v
该算法在分布式环境中以消息终止。我知道这不是您要的。
引理:如果存在边V-> Y且Y也是V 的间接继承者(例如V-> W-> + Y),则边V-> Y是可传递的,而不是可传递根的一部分。
方法:跟踪每个顶点的传递闭合,以从终端到初始顶点的反向拓扑顺序工作。V的间接继任者集合是V的直接继任者的及物关闭的并集。V的及物关闭是其间接继任者和其直接后继者的并集。
算法:
Initialise Visited as the empty set.
For each vertex V of G,
Invoke Visit(V).
Visit(V):
If V is not in Visited,
Add V to Visited,
Initialise Indirect as the empty set,
For each edge V -> W in G,
Invoke Visit(W),
Add Closure(W) to Indirect.
Set Closure(V) to Indirect.
For each edge V -> W in G,
Add W to Closure(V),
If W is in the set Indirect,
Delete the edge V -> W from G.
这假设您有某种有效的方式来跟踪顶点集(例如,位图),但是我认为这种假设也是在其他O(V + E)算法中做出的。
一个潜在有用的副作用是,它找到G的每个顶点的传递闭包。
我解决了相同的问题,但不完全相同,它要求缩小后的图形中没有边的最小值,以使原始连接的顶点仍然连接并且不建立新连接。 很明显,它不是说找到缩小的图,而是找到多少冗余边。 这个问题可以用O(V + E)解决。指向说明的链接是https://codeforces.com/blog/entry/56326。但我认为实际上要制作图,它会比O(N)具有更高的复杂度