Bron-Kerbosch アルゴリズムの C バージョンの実装に問題があります。
1-アルゴリズムの仕組みがまったくわかりません。私はインターネットで参考文献を見つけようとしましたが、それらはすべてひどいアルゴリズムの実装例でくだらないものであり、疑似コードに表示される任意の名前の関数 ( P(N) など) の説明はまったくありません。
2- インターネットでいくつかの C++ 実装を見つけましたが、作成者がコードで使用されているクラスを配置できなかったため、変数の名前がまったくわからないひどい名前の変数が残っています (compsub、nod、minnod など)。 、fixp、newne、newce)。
私が翻訳できた 1 つのコードは SegFaulting です。アルゴリズムを理解するのを手伝ってもらえますか/コードで何が間違っていたか教えてください。
役立つ情報:
graph->matrix は接続性マトリックスです。
List_clear は、リストのサイズを返します。
int serial (Graph* graph) {
int i;
int* all = (int *) malloc (graph->size * sizeof (int) );
List compsub;
List_init (&compsub);
for (i = 0; i < graph->size; i++)
all[i] = i;
bkv2 (graph, &compsub, all, 0, graph->size);
free (all);
return List_clear (&compsub);
}
// recursive function version 2 of Bron-Kerbosch algorithm
void bkv2 (Graph* graph, List* compsub, int* oldSet, int ne, int ce ) {
int* newSet = (int *) malloc (ce * sizeof (int) );
int nod, fixp;
int newne, newce, i, j, count, pos, p, s, sel, minnod;
minnod = ce;
nod = 0;
// Determine each counter value and look for minimum
for ( i = 0 ; i < ce && minnod != 0; i++) {
p = oldSet[i];
count = 0;
// Count disconnections
for (j = ne; j < ce && count < minnod; j++)
if ( !(graph->matrix[p][oldSet[j]]) ) {
count++;
// Save position of potential candidate
pos = j;
}
// Test new minimum
if (count < minnod) {
fixp = p;
minnod = count;
if (i < ne)
s = pos;
else {
s = i;
// pre-increment
nod = 1;
}
}
}
// If fixed point initially chosen from candidates then
// number of diconnections will be preincreased by one
// Backtrackcycle
for (nod = minnod + nod; nod >= 1; nod--) {
// Interchange
p = oldSet[s];
oldSet[s] = oldSet[ne]; sel = oldSet[ne] = p;
// Fill new set "not"
newne = 0;
for ( i = 0 ; i < ne ; i++)
if (graph->matrix[sel][oldSet[i]] )
newSet[newne++] = oldSet[i];
// Fill new set "cand"
newce = newne;
for (i = ne+1; i<ce; i++)
if (graph->matrix[sel][oldSet[i]] )
newSet[newce++] = oldSet[i];
// Add to compsub
List_add (compsub, sel);
if (newce == 0) {
// found a max clique
List_print(compsub);
} else if (newne < newce)
bkv2 ( graph, compsub, newSet, newne, newce );
// Remove from compsub
List_remove(compsub);
// Add to "not"
ne++;
if (nod > 1)
// Select a candidate disconnected to the fixed point
for ( s = ne ; graph->matrix[fixp][oldSet[s]] ; s++)
;
// nothing but finding s
} /* Backtrackcycle */
free (newSet);
}