在图中合并线性顶点链(在C ++中)

时间:2016-08-10 01:48:04

标签: c++ algorithm graph

我有一个大图,它在邻接列表中表示。我想通过合并线性节点链来压缩图形。例如,如果边是a-c, b-c, c-d, d-e, e-f, e-g

a - c - d - e - f
    |       |
    b       g

然后c-d, d-e可以合并到单个节点x,新的边缘列表应该有a-x, b-x, x-g。我想用C ++实现它,但我想知道是否有任何C ++图形库来处理它。此外,赞赏任何有效算法的建议。

2 个答案:

答案 0 :(得分:2)

我认为你的例子可能会被打破,所以我要解决一个稍微不同的问题:

a - c - i - d - e - f
    |           |
    b           g
                |
                h

我认为解决方案如下:

a - c - x - e - f
    |       |
    b       h

如果您同意,那么考虑计算每个顶点出现在邻接列表中的次数,并为每个顶点存储前两个邻居:

a b c d e f g h i
1 1 3 2 3 1 2 1 2
c c a i d e e g c
    b e g   h   d

它是2的地方,我们可以考虑折叠:dgi

d g i # candidates
2 2 2
i e c
e h d

现在你可以看到g有两个不在候选人中的邻居,所以只需删除g,因为它是一个单身"链。"这会留下d,其邻居i位于候选人中,因此将di折叠为新的顶点x,然后您就完成了。

答案 1 :(得分:2)

您只需删除度数为2的所有节点,将它们的两个邻居合并为一个节点。

重复这个过程直到没有剩下这样的节点。

Boost Graph library通常是存储和使用图表的好方法。请参阅here如何合并顶点并收缩边缘。