【发布时间】:2019-10-20 22:31:54
【问题描述】:
我有一个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::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 的两个顶点之间的那些。有没有一种优雅的方法可以有效地获得这些优势?
【问题讨论】:
-
FWIW,你的问题有点宽泛。考虑将您的问题限制得更具体。
-
我没有注意到这一点。我更新了我的问题。
-
我很困惑 “如果某个子图是解决方案的一部分,那么至少它的一个邻居也必须是解决方案的一部分。” 这似乎是不可能的,除非您的意思是“正确的子图”并且解决方案包含所有顶点。 为什么:解决方案由一组顶点组成。这些顶点形成一个子图,因此该子图的至少一个邻居(不在子图中,因此不在解决方案中)必须是解决方案的一部分?邻居既不在解中,又在解中——矛盾。
-
一个解有一个固定的大小 n。此语句仅适用于具有
-
@michip96 抱歉,我没有注意到您的回复,因为您没有在回复中标记我。我仍然不明白你在做什么。您会得到一个大小为
n的解决方案,您可以使用它来基于原始图形生成一个新图形。要检测“不可行”,请使用boost::connected_components()确保新图已连接(即具有单个连接组件)。下一步是获取解决方案的适当子图,并确保它有一个邻居是解决方案的一部分?但是只有一个连接的组件可以保证这一点,那么为什么要进行这个测试呢?