在图形中使用正好k个红色边缘查找生成树,边缘在线性时间内用红色/蓝色着色

时间:2014-02-11 15:27:38

标签: algorithm graph spanning-tree

给定带有红色和蓝色边缘以及常量 K 的图形 G ,设计一个确定性的线性时间算法,该算法可以找到 G的生成树正好 K 红色边缘(如果不存在这样的生成树,则返回False。)

到目前为止我们做了什么:

让每个红色边缘的权重为-1,每个蓝色边缘的权重为0。

查找最小生成树(使用标准线性时间算法)。因此,我们有一个生成树 T ,重量最小,这意味着我们使用尽可能多的红色边缘,因为红色边缘只会减轻重量。

如果 T 中的红色边缘少于 K ,我们会返回False

如果确实有 K 红色边缘,我们就完成了, T 就是答案。

如果红色边缘超过 K ,我们需要用蓝色替换它们。

这是我们的问题,我们如何在线性时间内做到这一点?

添加的每个蓝色边缘都会创建一个循环,因此从循环中移除一个红色边缘将起作用,但我们如何以这种方式确保线性?这甚至是一个好方法吗?

1 个答案:

答案 0 :(得分:3)

HINTS

您可以使用Prim's algorithm的两次传递在线性时间内执行此操作。 (通常Prim的算法不是线性时间,但是当你只有两种类型的边缘时,你不需要花时间排序边缘。)

通过1

在第一遍中,在红色边缘之前跟随蓝色边缘,并标记您不得不采取的任何红色边缘。

如果在此过程中标记C边缘,那么我们知道在任何生成树解决方案中必须至少有C个红色边缘,因此如果C> K,则不可能。

通过2

假设我们在第一遍中发现了C(< K)标记的边缘。

在第二遍中,在蓝色之前跟随红色边缘,直到其他红色边缘的总数达到K-C。在第二遍中,您还可以按照第一遍中标记的红色边缘(这些不计入您的总数)。

如果你的额外红色边缘没有达到K-C,则不可能。