Algorithm 在一个边在线性时间内被红/蓝染色的图中,使用恰好k条红边寻找生成树

Algorithm 在一个边在线性时间内被红/蓝染色的图中,使用恰好k条红边寻找生成树,algorithm,graph,spanning-tree,Algorithm,Graph,Spanning Tree,给定一个具有红色和蓝色边以及常数K的图G,设计一个确定的线性时间算法,该算法可以找到一个具有精确K条红色边的G生成树(如果不存在这样的生成树,则返回False) 我们迄今为止所做的工作: 让每个红边的权重为-1,每个蓝边的权重为0 找到最小生成树(使用标准线性时间算法)。因此,我们有一个最小权重的生成树T,这意味着我们使用了尽可能多的红边,因为红边只会减少权重 如果T中的红色边少于K条,则返回False 如果正好有K条红色边,我们就完成了,T就是答案 如果有超过K条红色边,我们需要用蓝色边替换它

给定一个具有红色和蓝色边以及常数K的图G,设计一个确定的线性时间算法,该算法可以找到一个具有精确K条红色边的G生成树(如果不存在这样的生成树,则返回
False

我们迄今为止所做的工作:

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

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

如果T中的红色边少于K条,则返回
False

如果正好有K条红色边,我们就完成了,T就是答案

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

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

每增加一条蓝边都会产生一个循环,因此从循环中删除一条红边会起作用,但我们如何才能以这种方式确保线性?这是一个好方法吗?

提示 您可以在线性时间内使用两次循环来执行此操作。(通常Prim的算法不是线性时间,但当您只有两种类型的边时,您不需要花费时间对边进行排序)

通过1 在第一个过程中,在红色边之前跟随蓝色边,并标记您被迫使用的任何红色边

如果在这个过程中标记C边,那么我们知道在任何生成树解中都必须至少有C条红色边,所以如果C>K,这是不可能的

通过2 假设我们在第一遍中找到了C( 在第二遍中,在蓝色之前跟随红色边,直到附加红色边的总数达到K-C。在第二遍中,您也可以跟随第一遍中标记的红色边(这些不计入您的总数)


如果附加的红边未到达K-C,则不可能。

不清楚您是在寻找具有K条红边的最小生成树,还是任何具有K条红边的生成树,或者是一个生成树,它在那些有K个红边的生成树中是最小的。刚刚发现它可以用边收缩来解决…不知道如何使用它。@Tyler:对我来说,这很清楚:“找到一个有K个红边的G的生成树”什么都没说minimality@RachelBernouli-在你的问题中,“找到一个最小生成树(使用标准的线性时间算法)。”你指的是哪种线性时间算法?很好的一种,我打算结合Kruskal提出一个非常类似的想法:首先使用
e=B+R
(B=蓝边,R=红边)运行它.设X为R中在该运行中使用的边。现在使用
e=X+(R\X)再次运行Kruskal+B
现在,一旦你选择了
k
条红边,就停止添加红边。@NiklasB。听起来也一样好。如果你把它作为一个答案,我会投赞成票:)请你进一步解释一下好吗?Prims算法适用于加权图,那么你说的“先去蓝边”是什么意思?我的意思是使用与你相同的方法(例如,将权重0分配给蓝边,将权重1分配给红边)。一旦完成此操作,Prim的算法将始终在可能的情况下优先添加蓝边而不是红边。@NiklasB。当运行Kruskal时,它不会使用联合查找并导致O(V logV)解吗?OP要求的是线性解。