如何仅在 2 个节点之间获取最短路径,给定邻接列表有向图?
How to get shortest path between 2 nodes only, given adjacency list directed graph?
我有一个用以下代码表示的图形:
typedef adjacency_list < vecS, vecS, directedS, property < vertex_name_t, idType >, property < edge_weight_t, double > > graph_t;
我有两个问题:
如何将我的图馈送到 Boost 中的 Dijkstra 算法中,我的意思是如何从我的图(数千个顶点和边(中提取属性以馈送 Dijkstra 参数。
示例中算法的输出是图中一个节点与其余节点之间的最短路径,那么我如何才能仅获得源节点和目标节点之间的最短路径? 我应该过滤输出结果以构建我的最短路径向量吗?
//===========================================================================
MyAlgorithm::MyAlgorithm(graph_t AnyGraph, Vertex VSource){// Parameters Constructor
MyGraph = AnyGraph;
vector<Vertex> p(num_vertices(AnyGraph));
// for(auto j = p.begin(); j != p.end(); ++j)
// cout <<"P["<< *j<<"] = "<<p[*j]<<endl;
vector<double> d(num_vertices(AnyGraph));
// for(auto j2 = d.begin(); j2 != d.end(); ++(j2))
// cout <<"d ["<< *(j2)<<"] = "<<d[*(j2)]<<endl;
//===========================================================================
//Dijkstra_Algorithm
//===========================================================================
cout<<"Beforet"<<endl;
dijkstra_shortest_paths(AnyGraph, VSource,
predecessor_map(boost::make_iterator_property_map(p.begin(), get(boost::vertex_index, AnyGraph))).
distance_map(boost::make_iterator_property_map(d.begin(), get(boost::vertex_index, AnyGraph))));
cout<<"Aftert"<<endl;
//===========================================================================
}// End of Parameters Constructor
我正在回答你的第二个问题:
你不能只要求 dijkstra 的算法一条路径,因为路径是逐渐形成的,但你仍然可以为每个节点保存一个父节点,该父节点在开始节点和结束节点之间的路径中说明哪个节点是该节点的前一个节点。 之后,您可以从目标节点开始,并获取其父节点,直到到达开始节点。
首先,如果没有对每个节点的距离进行成本估算,则无法使用 Dijkstra。
也就是说,这个问题足够小,您可以从一开始就简单地进行广度优先搜索,以找到到达目标的最佳路线。
如果要提高效率,可以同时从源和目标进行搜索,并找到它们的相遇位置。 保证最佳状态有点棘手,但这会使平均搜索速度更快。
相关文章:
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- C++创建指向有向图中节点的指针数组
- 如何仅在 2 个节点之间获取最短路径,给定邻接列表有向图?
- 有向图 - 如何计算图中彼此顶点可到达的顶点数?
- C++计算有向图中的最短路径
- 使用非递归 DFS 检测有向图中的周期
- 如何将这些节点连接为有向图
- 如何使用广度优先搜索确定是否可以在有向图中到达顶点
- 在有向图中精确访问所有节点一次
- 在有向图中查找第二条最短路径
- 关于如何处理有向图的一个想法
- 找到有向图C 的最短路径
- 分析输入文件以创建有向图C++
- 在使用无序多映射实现的有向图中查找循环
- 如何找到在c++中实现的有向图的所有路径作为邻接列表
- 如何创建具有多个数据的节点的有向图
- 有向图中的广度优先搜索
- 将边添加到使用链表实现的有向图(邻接列表)C++
- 使用c++向量的有向图的邻接列表表示
- 将文本文件解析为C++有向图或邻接列表