使用深度优先搜索计算最大独立集

时间:2015-12-14 13:14:20

标签: algorithm graph-algorithm depth-first-search breadth-first-search

  

一组独立的无向图G =(V,E)是V的子集I,使得   我没有两个顶点相邻。也就是说,如果u和v在I中,则(u,v)不在E中。   最大独立集合M是一个独立集合,如果我们要添加的话   任何额外的顶点到M,那么它就不再是独立的了。一切   图形具有最大独立集。 (你能看到这个吗?这个问题不是   练习的一部分,但值得思考。)给出一个有效的算法   计算图表G的最大独立集合。这是什么方法   运行时间?

我不确定对深度优先搜索的修改是否会产生上述问题的解决方案,但这是我的尝试(注意:我不是在寻找代码,只是对我应该做的事情的高级描述)< / p>

使用DFS,我们将从一些起始顶点S1开始遍历图的所有顶点。从S1开始,我们转到相邻边S2,如果不存在相邻边,我们将S1加到最大独立集M,因为这个顶点在G中的任何其他顶点之间没有边,如果是这种情况那么我们选择另一个顶点S1&# 39;并从那一点(递归)做DFS。

假设S1和S2之间存在边缘,那么我们可以将S1添加到独立集但不是S2,然后DFS继续,我们添加S3因为S3与S1没有共享边缘,DFS继续以及我们做什么我们继续将S [k]添加到集合M中,只要它与M中已存在的当前元素不共享边缘。

这将花费我们O(| V | + | E |)时间复杂度。原因:DFS是O(| V | + | E |),每次我们移动到一个新节点时,我们必须检查M中的某些K元素,以确保它们不共享边缘。那就是O(k(| V | + | E |))= O(| V | + | E |)。

最坏情况:空图,| V |调用DFS给我们O(| V |(| V | + | E |)

问题:

(1)这是否正确,我是否真的找到最大独立集或最大独立集?

(2)如果正确,这是否有效?

如果完全错了,我真的很感激解决方案,我已经考虑过这个问题了一段时间。

1 个答案:

答案 0 :(得分:1)

以下是我将如何解决它:

输入:一组顶点V,邻接列表E[v](每个顶点一个):

  1. 准备一个大小为take[]的数组|V|,其中包含bool个值。最初,所有元素都设置为false。这个数组告诉我们哪些顶点被带入结果。
  2. take[0]设为true
  3. 对于每个顶点v = 1..|V| - 1:如果E[v]不包含边(v, u)take[u]true,则将take[v]设置为true。< / LI>
  4. 返回所有顶点vtake[v]true
  5. 总时间为O(|V| + |E|)