Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 蛮力顶点覆盖算法的优化_C++_Algorithm_Optimization_Vertex Cover - Fatal编程技术网

C++ 蛮力顶点覆盖算法的优化

C++ 蛮力顶点覆盖算法的优化,c++,algorithm,optimization,vertex-cover,C++,Algorithm,Optimization,Vertex Cover,我正在编写一个蛮力算法来解决顶点覆盖问题,如下所示: BruteForceVertexCover( Graph G = (V,E) ){ for size= 1 ... |V| vector<int> v = {0...size-1} do{ if(test(G, v)) return v; //test if v covers G } while(v has next combi

我正在编写一个蛮力算法来解决顶点覆盖问题,如下所示:

BruteForceVertexCover( Graph G = (V,E) ){
    for size= 1 ... |V|
        vector<int> v = {0...size-1}
        do{
            if(test(G, v)) return v;     //test if v covers G
        }
        while(v has next combinations of lenght size);
    return empty vector<int>;
}

//this stops when find a answer, and it will find,
//since it tries all combinations of all sizes
BruteForceVertexCover(图G=(V,E)){
对于尺寸=1…| V|
向量v={0…大小-1}
做{
if(test(G,v))返回v;//测试v是否覆盖G
}
而(v具有长度大小的下一个组合);
返回空向量;
}
//当你找到答案时,它就会停止,
//因为它尝试所有大小的组合
在哪里

bool检验(图G=(V,E),向量V){
对于v中的每个u:
对于每个w in G[u]
将u从G[w]中移除//这是向量G[w]的线性大小
清除G[v]//删除所有具有u的(双向)边
对于i=0…| V|
如果(G[i]不是空的)返回false;
返回true;
}

我尝试了很多图(但它们的最大大小是20个顶点),这需要十年的时间。。。我可以对这个蛮力进行任何优化,使它运行得更快吗?

至少有2个。首先,您可以尝试以不同的顺序生成顶点集,以最大限度地减少从一个集合到下一个集合的更改数量(如果您不关心以增加大小的顺序生成它们,则这将是格雷码顺序),并且还可以按与上一个集合的差异数量成比例的时间对每个顶点集进行测试。理想情况下,这将使每次迭代从O(n)到O(1)。其次,您可以应用一种称为“中间相遇”的技术,将时间复杂度从O*(2^n)降低到O*(2^(n/2)):将顶点任意划分为2个集a和B,每个集的大小为10,然后对于a的2^10个子集X中的每一个,测试它是否是由a引起的子图的顶点覆盖。如果是,确定a和B之间的哪些边保持未覆盖:每个这样的边立即确定B中必须包含的顶点。设Y为B中的顶点集“必须包含”。如果z[Y]小于其当前值(最初为无穷大),则将其更新为| X |。。。。。。在此之后,对于至少为z[S]指定了1个赋值的任何顶点集S,z[S]告诉您A中需要包含的最小顶点数,以便在至少S中的顶点(回忆一下,这些顶点都来自B)在解决方案中的约束下解决整个问题。我们现在想做的是尝试B的2^10子集Y中的每一个,对于每一个我们发现是由B诱导的子图的顶点覆盖的子集,不知何故查找z[S]的最小值w,使得S是Y的子集,并检查| Y |+w是否是迄今为止的最佳解。。。。。。但该查找步骤(TTBOMK)不能有效地完成(即,在多时间内)。我们所能做的是考虑每一个计算量Y的所有子集Y,对于每一个计算y++[y],然后,除了检查这个y是否解B(如果是的话,到目前为止,y y+z [y]是否是最好的整体解),“将这个关于y的信息推到包含y的每个子集S中,再加上B的1个以上元素:即,对于B\Y中的每个顶点x,如果z[yu{x}小于其当前值,则使用| Y |+z[Y]+1更新z[yu{x}。这确保每个z[S]在我们需要的时候都准备好了。@Daniel我能看看你的实际代码吗?我正在研究同一个问题
bool test( Graph G = (V,E), vector<int> v ){
    for each u in v:
        for each w in G[u]
            remove u from G[w]     //this is linear in size of vector G[w]
        clear G[v]                 //removed all (bidirectional) edges that have u
    for i = 0 ... |V|
        if(G[i] is not empty) return false;
        return true;
}