记忆保守的最大独立顶点集

时间:2012-05-30 07:38:07

标签: c++ algorithm graph graph-theory stl-algorithm

我想找到一个内存保守而有效的算法,用于在无向图中设置最大独立顶点。

传统算法使用辅助数据结构(原始图的副本)来实现它。我想避免这种并行结构,因为内存分配对于实时实现来说很慢,并且我有一些内存边界。 我只想用布尔标签标记MIS中的节点。 有可能吗?

请注意,我不希望最大独立,而是最大独立设置。

P.S。 我知道这个问题与语言无关,但我用C ++和STL进行编码。

3 个答案:

答案 0 :(得分:1)

如果每个节点i只有你的布尔标签(i),这是一个解决方案。需要时间O(| V | + | E |),其中| V |是节点数和| E |是输入图中的边数。

For all nodes v
   set label(v)=false;
For all nodes v
   if (all neighbors w of v have label(w)=false)
      set label(v)=true

带有label(v)= true的节点v是最大独立集。它们是独立的,因为根据构造,任何标记的节点v都不能具有标记的邻居。并且它们是一个最大集合,因为您只是激活标签,并且如果另一个已标记为邻居的w阻止节点v未标记,则只保留该节点。

优化注释:如果节点编号为1 ... n,则只需要检查邻居w = 1..v-1,因为任何其他w都不能有标签(w)= true。

答案 1 :(得分:0)

如果不确切知道您的数据结构是什么,就很难回答这类问题。近就地图形操作的常用技巧是窃取两个位,否则指针会为零,并对图形结构进行可逆更改,但我不确定它们是如何应用的。

通过阅读你所写的内容,似乎没有办法在没有遍历的情况下迭代图中的节点。你如何表示例如DFS的堆栈?

答案 2 :(得分:0)

我使用临时vectordeque<bool>来指示元素,边或方面使用哪些顶点,...

std::deque<bool> used(vertex.size(), false);
for (size_t e = 0; e < edge.size(); ++e)
{
    used[edge[e].v1] = true;
    used[edge[e].v2] = true;
}

现在使用== true表示所有使用的顶点。如果你愿意,其他人可能会崩溃。