Boost:从最短路径创建图

Boost: Create Graph from shortest Path

本文关键字:创建 最短路径 Boost      更新时间:2023-10-16

目前我正在使用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;
}

如何检查图中是否存在顶点?对于改进流程或解决问题,您还有其他的想法吗?

谢谢迈克尔。

我会考虑在原始图上做一个filtered_graph适配器,过滤掉所有在有趣的路径中未访问的顶点/边。

然后是一个简单的copy_graph来创建新的图。

如果您将图形类型更改为filtered_graph中的labeled_graph,那么您甚至不需要副本,这取决于您的性能权衡。