我正在使用回溯算法编写一个程序来检查我的图表中是否有k-clique W
(W
是一个2D数组)。
k-clique意味着在我的图W
中存在k-顶点,使得每个顶点连接(形成边)到所有其他(k-1)顶点。例如,如果有一个边缘,我们说v1,v2和v3形成3-clique:
v1
和v2
。v1
和v3
。v1
和v4
。v2
和v3
。v2
和v4
。v3
和v4
。即如果v1
,v2
和W[v1][v2] == 1
之间存在边缘。
boolean haskclique(int n, int k, int [][] W){
int[] kVertices = new int [k + 1];
return haskcliqueRec(n, k, 0, kVertices, W);
}
public static boolean
haskcliqueRec(int n, int k, int i, int [] kVertices, int W[][]){
boolean hasKclique = true;
if (i == k) {
//check if kCLique
for ( int x = 1; x <= k; x++){
int y = x + 1;
while (hasKclique && y <= k){
if( W[ kVertices[x] ][ kVertices[y] ] != 1 )
hasKclique = false;
if ( y == k && hasKclique)
return true;
y++;
}
}
}
else{
for (kVertices[1] = W[1][1]; kVertices[1] <= k; kVertices[1]++)
{
kVertices[i+1] = W[1][1];
//Check if there is a repeat
if( kVertices[i+1] != kVertices[i] )
haskcliqueRec(n, k, i+1, kVertices, W);
}
}
return false;
}
当我的方法返回true
时,我收到false
。为什么呢?