我有一个大图,它在邻接列表中表示。我想通过合并线性节点链来压缩图形。例如,如果边是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 ++图形库来处理它。此外,赞赏任何有效算法的建议。
答案 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的地方,我们可以考虑折叠:d
,g
和i
:
d g i # candidates
2 2 2
i e c
e h d
现在你可以看到g
有两个不在候选人中的邻居,所以只需删除g
,因为它是一个单身"链。"这会留下d
,其邻居i
位于候选人中,因此将d
和i
折叠为新的顶点x
,然后您就完成了。
答案 1 :(得分:2)
您只需删除度数为2的所有节点,将它们的两个邻居合并为一个节点。
重复这个过程直到没有剩下这样的节点。
Boost Graph library通常是存储和使用图表的好方法。请参阅here如何合并顶点并收缩边缘。