查找仅包含度2和3的节点的最大子图

时间:2019-04-01 15:53:22

标签: algorithm graph language-agnostic graph-theory depth-first-search

我正尝试从以下论文中实现(未加权)反馈顶点集近似算法:documentation。该算法的步骤之一(在第4页上进行介绍)是计算输入图的最大2-3个子图。

准确地说,2-3图是只具有2或3级顶点的图形。

“最大”是指在不违反2-3个条件的情况下,不能将原始图的一组边或顶点添加到最大子图中。

该论文的作者声称,可以通过图形上的“简单深度优先搜索(DFS)”来执行计算。但是,这种算法似乎使我难以理解。最大子图如何计算?

1 个答案:

答案 0 :(得分:1)

我认为我设法弄清楚了作者的意图。不过,我不会这么简单。

让G为图,H为G的最初为空的2-3子图。该算法与深度优先遍历具有相似的族,但是我不会这样称呼。从任意节点开始,我们在图中走动,将步骤推入堆栈。每当我们检测到堆栈包含将构成H的2-3个超图的路径/循环/ sigma形状时,就会将其从堆栈移至H并继续。当不再可能找到这样的形状时,H为最大值,我们就完成了。

更详细地讲,堆栈通常由一条路径组成,该路径没有H阶3的节点。光标位于该路径的一端。在每一步中,我们都会检查到达终点的下一条边。如果唯一的入射边是我们到达的那个边,则将其从G和堆栈中删除,并将末尾移回一个。否则,我们可能会将路径扩展一些边缘e。如果e的另一个端点的H度为3,我们从G中删除e并考虑到末端的下一个边沿。如果e的另一个端点的H度为2,但当前不在堆栈中,则我们已将此端点锚定。如果另一端也锚定,则将堆栈路径添加到H并继续前进。否则,将光标移到堆栈的另一端,以反转堆栈。最后一种情况是堆栈是否循环返回自身。然后,我们可以提取路径/循环/ sigma并继续前进。

在移动设备上输入此内容,非常抱歉。也许我会花时间实施它。

相关问题