合并图中顶点的线性链(c++)

Merging linear chain of vertices in a Graph (in C++)

本文关键字:c++ 线性 顶点 合并      更新时间:2023-10-16

我有一个很大的图,它用邻接表表示。我想通过合并线性节点链来压缩图。例如,如果边是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++图形库处理这个。此外,任何有效的算法的建议是赞赏的。

我想你的例子可能坏了,所以我要解决一个稍微不同的:

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的地方,我们可以考虑坍缩:在d, gi:

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

现在您可以看到g有两个邻居不在候选中,所以只需删除g,因为它是一个单例"链"。剩下d,它的邻居i在候选顶点中,所以将di折叠成一个新的顶点x,你就完成了。

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

重复此过程,直到没有这样的节点留下。

Boost Graph库通常是存储和处理图形的好方法。查看这里如何合并顶点和收缩边缘