包括每个节点的最小子图数量?

时间:2018-08-22 07:07:46

标签: algorithm

假设我们有一个N个节点的图,并且有这个原始图的S个子图,其中每个子图都包含N个节点的子集。确保每个节点至少存在一个子图中。

我们想知道S中最小的子图X数,以使N个节点中的每个节点至少在所选X个子图的一个子图中至少包含一次。有没有办法有效地做到这一点?

3 个答案:

答案 0 :(得分:1)

您的问题是Set cover problem的一个实例。机套是NP-Hard的,因此很遗憾,通常没有办法有效地解决此问题。

答案 1 :(得分:0)

我有两个解决方案,它们不要求您通过所有可能的组合来强行使用,一个不是太完美,另一个是效率较低。 就像SaiBot所说的那样,似乎没有一个完美而有效的答案。

  1. 您可以从每个子图X开始一次,然后继续添加包含丢失最多的节点的图。然后,您可以选择需要最少子图的解决方案。

  2. 您可以为每个子图X赋予一个“独立”值,该值描述其他子图中也没有(或很少)包含他的多少个节点,并将其与方法一结合以获得可能更理想的解决方案以产生此“独立性”值为代价。

答案 2 :(得分:0)

如前所述,这是一个NP难题。如果愿意,可以有效地将其近似为ln(n)的因数。这是一个尽可能有效地实现的近似值(假设NP难问题在指数复杂度上较低)。

您可以使用Greedy set cover algorithm进行此操作。 基本上,该算法的作用是反复选择具有最多未发现元素(顶点)的集合(在您的情况下为子图)。重复此操作,直到不再存在未发现的元素为止。