目前我正在使用boost图库。 我的图表包含自定义顶点和边缘属性:
typedef boost::labeled_graph<boost::adjacency_list<
boost::listS, boost::vecS, boost::directedS, Vertex, Edge>, int> Graph;
Graph g;
我需要计算最短路径(Dijkstra)的功能,因此用户必须选择一个或多个开始和结束节点。选择节点并计算每个起始节点和结束节点之间的最短路径后,应创建一个新图形。最后,新图形应包含位于每条最短路径上的所有顶点/边。
我的想法是:
1:我对计算出的最短路径
进行了回溯 typedef std::vector< VertexDescriptor> Path;
2:我检查顶点是否已包含在新图中。 (我不知道如何处理那个),如果是这样的话我将顶点复制到新图中。
3:我检查边是否已包含在新图中,如果是,我将边复制到新图中。
Graph graphPaths;
Path::reverse_iterator rit;
VertexDescriptor lastNode = *path.rbegin();
for (rit = path.rbegin(); rit != path.rend(); ++rit) {
// Vertex v =
// check if vertices already exist in new GraphPath
if (graphPaths[indexMap[*rit]] == NULL) {
Vertex v = g[indexMap[*rit]];
VertexDescriptor vd = boost::add_vertex(indexMap[*rit], graphPaths);
graphPaths[indexMap[*rit]] = v;
}
// check if edge is already included in new Graph
if (!boost::edge(lastNode, *rit, graphPaths).second) {
Graph::edge_descriptor ep = boost::edge(lastNode, *rit, g).first;
boost::add_edge_by_label(indexMap[lastNode], indexMap[*rit], g[ep],
graphPaths);
}
}
lastNode = *rit;
}
如何检查图表中是否存在顶点。您是否有其他想法来改进流程或解决问题。
由于 迈克尔
答案 0 :(得分:1)
我会考虑在原始图上做一个filtered_graph适配器,过滤掉在有趣路径中没有访问过的所有顶点/边。
然后创建新图表就是一个简单的copy_graph
。
如果您将图表类型更改为labeled_graph
的{{1}},那么您甚至不需要副本,具体取决于您的效果权衡。