Boost:从最短路径创建图
Boost: Create Graph from shortest Path
目前我正在使用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
,那么您甚至不需要副本,这取决于您的性能权衡。
相关文章:
- 内存效率表示最短路径的方法?
- 用于查找网格中最短路径的算法
- 查找最短路径算法
- BFS 打印最短路径
- 使用 Dijkstra 算法跟踪两个节点之间的最短路径
- 使用C++具有两个数字的最短路径算法.(C++)
- 使用迭代深度优先搜索算法的未加权图的最短路径
- 如何仅在 2 个节点之间获取最短路径,给定邻接列表有向图?
- 如何使用贝尔曼-福特算法返回所有具有捆绑重量的最短路径?
- 使用优先级队列查找所有与 Dijkstra 相同的最短路径
- 尝试在图形中查找最短路径时的无限循环
- C++计算有向图中的最短路径
- 使用BFS存储和打印最短路径
- 如何制作由原始图形的最短路径边组成的新图形
- 有没有一种方法可以使用弗洛伊德-沃歇尔算法给出最短路径,其中存在负权重循环而不允许重叠边缘?
- 加权图的开始和结束的最短路径
- 使 c++11 Dijkstra 实现返回最短路径
- 弗洛伊德最短路径算法C++
- Dijkstra 最短路径算法性能 std::p riority_queue VS std::set.
- Boost:从最短路径创建图