我正在尝试理解Bron-Kerbosch算法(带有枢轴)在无向图中查找最大团的方法。 我有一些问题:
1. 选择枢轴顶点是否有任何标准? 我已经看到了一些实现,选择具有最多邻居的顶点进行优化,而其他人则只是选择前面的候选顶点作为枢轴顶点。 选择具有最多邻居的顶点如何帮助优化?
2. 通过选择枢轴顶点,在搜索团时有助于缩小要检查的候选顶点列表,从而减少递归调用的数量。没有枢轴的算法检查所有顶点以确定它们是否形成一个团,而具有枢轴的算法仅检查必须包括以形成最大团的顶点的P \ N(u)。 这样,如果发现非最大团,则算法可以立即回溯,而不是在永远不会形成最大团的顶点上不必要地执行递归。我的理解正确吗?
来自Wikipedia的伪代码:
1. 选择枢轴顶点是否有任何标准? 我已经看到了一些实现,选择具有最多邻居的顶点进行优化,而其他人则只是选择前面的候选顶点作为枢轴顶点。 选择具有最多邻居的顶点如何帮助优化?
2. 通过选择枢轴顶点,在搜索团时有助于缩小要检查的候选顶点列表,从而减少递归调用的数量。没有枢轴的算法检查所有顶点以确定它们是否形成一个团,而具有枢轴的算法仅检查必须包括以形成最大团的顶点的P \ N(u)。 这样,如果发现非最大团,则算法可以立即回溯,而不是在永远不会形成最大团的顶点上不必要地执行递归。我的理解正确吗?
来自Wikipedia的伪代码:
*Without Pivoting
algorithm BronKerbosch1(R, P, X) is
if P and X are both empty then
report R as a maximal clique
for each vertex v in P do
BronKerbosch1(R ⋃ {v}, P ⋂ N(v), X ⋂ N(v))
P := P \ {v}
X := X ⋃ {v}
*With Pivoting
algorithm BronKerbosch2(R, P, X) is
if P and X are both empty then
report R as a maximal clique
choose a pivot vertex u in P ⋃ X
for each vertex v in P \ N(u) do
BronKerbosch2(R ⋃ {v}, P ⋂ N(v), X ⋂ N(v))
P := P \ {v}
X := X ⋃ {v}