[英]Boost Graph find neighbours of a group of vertices
我有一个undirected_unweighted_graph graph;
其定义如下:
typedef typename boost::adjacency_list<boost::vecS,boost::vecS,boost::undirectedS,boost::no_property,boost::no_property> undirected_unweighted_graph;
它有几个顶点,通过无向边互连。 在我的算法中,我正在搜索图的连接子graph
,它只包含一些具有某些属性的顶点。
我正在使用线性优化软件包,它为我的问题提供了可能的最佳解决方案。 溶液由一组具有固定大小n个顶点的和可能是不可行的(即顶点没有连接在对应的子图graph
)。 我目前正在生成一个带有解决方案顶点的新图形,并添加了graph
中也存在的边缘。 我正在使用boost::connected_components()
来计算连接的组件。
现在我来问我的问题:
对我而言,下一步是通过施加约束来提高生成解决方案的性能。 具体来说,我将“增长”一个解决方案,从单个节点开始,以n
节点的子图结束。 在每个阶段,通过添加其中一个邻居来增加部分解决方案。 (这个想法是,如果部分解决方案可以扩展到完整解决方案,那么至少有一个邻居将处于完整解决方案中。)如何识别这些邻居?
我的方法如下:
我迭代每个组件,然后迭代boost::out_edges(v, g)
。 然后我必须检查邻居是否是我的组件的一部分。 如果它不是组件的一部分,我将它添加到组件邻居组。 我想知道在boost中是否有任何方法可以迭代boost::out_edges(V, g)
以获得顶点列表V
编辑
更具体一点:给定一个图形,我能够迭代给定顶点的邻居,如下所示:
for (auto edge: boost::make_iterator_range(boost::out_edges(v, graph))) {
//do stuff
}
如果我有一个连通的组件,比如顶点std::vector<size_t> component
的向量,该怎么办? 我想要的是组件的传出边缘,意味着顶点的所有传出边缘除了在component
两个顶点之间的那些边缘。 是否有一种优雅的方式来有效地获得这些边缘?
我不会迭代多个顶点。 相反,我会维护两组顶点 - 一组包含当前部分解中的顶点,另一组包含与部分解相邻(而不是)的顶点。 当线性优化包将顶点添加到局部解时,该顶点也应该从邻接集移动到解决方案中的顶点集。 接下来,需要迭代来自新顶点的边,但只需要迭代来自新顶点的边。 对于与新单元相邻的每个顶点,如果它不在部分解中,则将其添加到相邻顶点集。
我也会尝试类似的东西,只使用一个包含部分解决方案中的顶点和与部分解决方案相邻的顶点。 减少开销。 根据周围代码的期望,该集合可能与仅具有相邻顶点的集合一样有效。
这种方法的优点是可以消除重复性工作。 如果您已经查看了顶点A的所有邻居,为什么还需要再次查看它们,因为顶点B已添加到您的集合中?
这种方法的一个缺点是,如果需要有时回溯,可能需要大量的内存开销(考虑深度优先搜索并维护这些集合的堆栈)。 这有多糟糕取决于n
大小,平均来说,有多少边连接到每个顶点。 即使在一个糟糕的情况下,一些聪明的冗余消除可能会挽救这种方法,但我会留待以后。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.