提升:从最短路径创建图表

时间:2016-11-02 09:20:53

标签: c++ boost graph shortest-path dijkstra

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

如何检查图表中是否存在顶点。您是否有其他想法来改进流程或解决问题。

由于 迈克尔

1 个答案:

答案 0 :(得分:1)

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

然后创建新图表就是一个简单的copy_graph

如果您将图表类型更改为labeled_graph的{​​{1}},那么您甚至不需要副本,具体取决于您的效果权衡。