gpt4 book ai didi

c - Bron-Kerbosch C 实现

转载 作者:太空宇宙 更新时间:2023-11-04 04:52:08 24 4
gpt4 key购买 nike

我在实现 Bron-Kerbosch 算法的 C 版本时遇到了一些问题:

1- 我完全不了解该算法的工作原理。我试图在 Internet 上找到引用资料,但所有这些引用资料都很糟糕,算法示例实现糟糕透顶,并且对伪代码中出现的一些任意命名的函数没有任何解释(例如 P(N) )

2- 我在互联网上找到了一些 C++ 实现,但作者未能放入代码中使用的类,所以我留下了非常命名的变量,我什至不知道它们是什么类型(例如 compsub,点头,minnod,fixp,newne,newce)。

我能够翻译的一个代码是 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);
}

最佳答案

对于此实现,矩阵的对角线元素必须为真,例如,graph->matrix[i][i] 对于所有 i 都应该为真。这有点不寻常,我猜你的输入不是,在那种情况下,只是暂时将它们分配给 true,它应该可以工作。

关于c - Bron-Kerbosch C 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14114934/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com