DAG的传递还原


13

我正在寻找O(V + E)算法来找到给定DAG 的传递减少

那就是删除尽可能多的边,这样,如果您可以从u到达v,则对于任意v和u,在去除边之后仍然可以到达。

如果这是标准问题,请向我指出一些模型解决方案。


您不能使用您引用的维基百科引理中给出的参考?
亨德里克

2
好吧,维基百科中讨论的算法以O(V×E)(在最佳情况下,即在非循环图的情况下)而不是O(V+E)。我认为正确的答案是您当前正在寻找的算法可能不存在
Carlos LinaresLópez'12

1
同意不清楚您要的东西是否存在。如果有这样的算法,那么很多论文将变得毫无意义,例如,sciencedirect.com/science/article/pii/0012365X9390164O。就是说,如果您可以更明确地了解自己的动机,那么可能会有更具体的解决方案。例如,您对图是否了解其他任何信息,或者O(n(n+m))工作吗?
William Macrae

我在某个地方看到了问题,但是没有其他信息,也许是问题中的错字。
卡兰2012年

1
如果您在DAG中进行拓扑排序,但是通过使用子项来跟踪可到达的顶点该怎么办呢,例如,,然后从排序图中的最新项开始,和删除未使用的边缘,通过保留可达功能上去了,这给你最大可能边去掉,但我不知道,如果它得到最大可能性(它的。ø | Ë | + | V |reachable[v]=vchildrenvreachable[v]O(|E|+|V|)

Answers:


8

我们可以通过在每个顶点上执行DFS来解决此问题。

  1. 对于每个顶点,从每个顶点开始DFS,使得是的直接后代,即。是边。v v ù Û v uGvvu(u,v)
  2. 对于DFS从可以到达的每个顶点,除去边。 v ü v 'vv(u,v)

上面的总体复杂度是运行 DFS' 的复杂度,即。O N N + M NO(N(N+M))


1
请注意,渐近地,这与问题本身链接的Wikipedia文章中的算法具有相同的复杂性。O(NM)
David Richerby 2014年

1
同意 由于该问题的答案很简洁,因此我提出了一个。此外,解决方案不太可能是IMO。O(N)
pratyaksh

3

不是你想要的。但是仅出于共享知识的目的,如果假设每个顶点都充当处理器,则可以使用消息来实现。注意每个顶点都有一个可比较的值。因此,存在一些顶点,使得它们大于所有邻居。这些顶点执行以下操作:O(|E|)

  1. 让是最大的小邻居,vuv
  2. 向发送一条消息,并在输出中包括边。v u u(v,u)
  3. 对于每一个邻居的和(比都较小),不包括输出。u v v w wuv(v,w)
  4. 重复这些步骤,直到输出中包含或不包含顶点的较小邻居的所有边。v ' v(v,v)vv

现在,如果节点从每个更大的邻居接收到一条消息(即包括或不包括所有边缘,则节点行为就好像它是其邻域中最大的一样。前面提到的4个步骤。v 'v vv(v,v)v

该算法在分布式环境中以消息终止。我知道这不是您要的。O(|E|)


1

引理:如果存在边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的每个顶点的传递闭包。


我已经删除了您先前帐户中发布的答案。如果您仍然希望合并两个帐户,请按照帮助中心中的步骤进行操作。话虽如此,由于较早的帐户不再具有任何可见的内容,因此您可以坚持使用新的帐户。
吉尔斯(Gilles)'“ SO-别再邪恶了”

0

我解决了相同的问题,但不完全相同,它要求缩小后的图形中没有边的最小值,以使原始连接的顶点仍然连接并且不建立新连接。 很明显,它不是说找到缩小的图,而是找到多少冗余边。 这个问题可以用O(V + E)解决。指向说明的链接是https://codeforces.com/blog/entry/56326。但我认为实际上要制作图,它会比O(N)具有更高的复杂度

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.