给定带有红色和蓝色边缘以及常量 K 的图形 G ,设计一个确定性的线性时间算法,该算法可以找到 G的生成树正好 K 红色边缘(如果不存在这样的生成树,则返回False
。)
到目前为止我们做了什么:
让每个红色边缘的权重为-1,每个蓝色边缘的权重为0。
查找最小生成树(使用标准线性时间算法)。因此,我们有一个生成树 T ,重量最小,这意味着我们使用尽可能多的红色边缘,因为红色边缘只会减轻重量。
如果 T 中的红色边缘少于 K ,我们会返回False
。
如果确实有 K 红色边缘,我们就完成了, T 就是答案。
如果红色边缘超过 K ,我们需要用蓝色替换它们。
这是我们的问题,我们如何在线性时间内做到这一点?
添加的每个蓝色边缘都会创建一个循环,因此从循环中移除一个红色边缘将起作用,但我们如何以这种方式确保线性?这甚至是一个好方法吗?
答案 0 :(得分:3)
您可以使用Prim's algorithm的两次传递在线性时间内执行此操作。 (通常Prim的算法不是线性时间,但是当你只有两种类型的边缘时,你不需要花时间排序边缘。)
在第一遍中,在红色边缘之前跟随蓝色边缘,并标记您不得不采取的任何红色边缘。
如果在此过程中标记C边缘,那么我们知道在任何生成树解决方案中必须至少有C个红色边缘,因此如果C> K,则不可能。
假设我们在第一遍中发现了C(< K)标记的边缘。
在第二遍中,在蓝色之前跟随红色边缘,直到其他红色边缘的总数达到K-C。在第二遍中,您还可以按照第一遍中标记的红色边缘(这些不计入您的总数)。
如果你的额外红色边缘没有达到K-C,则不可能。