C++ 具有优先级队列的BGL DFS访问者
我有一棵树(在图形意义上)表示一棵树(在物理意义上)。树表示为BGL邻接列表,其中每个顶点都包含半径和位置属性,即,我的图在表格中定义C++ 具有优先级队列的BGL DFS访问者,c++,boost,graph,depth-first-search,boost-graph,C++,Boost,Graph,Depth First Search,Boost Graph,我有一棵树(在图形意义上)表示一棵树(在物理意义上)。树表示为BGL邻接列表,其中每个顶点都包含半径和位置属性,即,我的图在表格中定义 struct TreeVertexType { double radius; double position[3]; } typedef adjacency_list<vecS, vecS, undirectedS, TreeVertexType> Tree; struct TreeVertexType{ 双半径; 双位[3]; } t
struct TreeVertexType {
double radius;
double position[3];
}
typedef adjacency_list<vecS, vecS, undirectedS, TreeVertexType> Tree;
struct TreeVertexType{
双半径;
双位[3];
}
typedef邻接列表树;
我想在树上执行DFS,以便创建分支列表。另外的要求是,每当一个顶点有多个未探测的相邻顶点时,它都会选择具有最大半径的顶点。此规则确保图的遍历顺序代表物理树分支
DFS访问者似乎不支持优先级队列,因此我想知道是否有其他搜索公式可以通过*
或者,我可以通过排序顶点来实现自己的DFS算法,但如果可能的话,我更愿意利用BGL框架
谢谢
-John您可以使用
set
而不是vecS
来指定一个容器,并对该特定属性进行排序。例如,如果要对边进行排序,可以使用adjacence\u list
并为TreeVertexType
设置一个比较运算符。您可以使用set
而不是vecS
来指定对该特定属性进行排序的容器。例如,如果要对边进行排序,可以使用邻接列表
,并在DFS boost::graph期间为TreeVertexType
使用堆栈来推送相邻顶点,这些顶点稍后将按推送顺序弹出
std::向量堆栈代码>//第94行boost\u 1\u 47\u 0 of depth\u first\u search.hpp
作为一种解决方法,您可以使用相同的push()和pop()界面重新定义此堆栈
,您可以做的是,当任何顶点
被推入堆栈
时,只需对堆栈
的元素进行排序,使半径最大的顶点始终位于顶部
换句话说,用您自己的优先级队列伪造堆栈接口
这将减轻您编写自己的DFS的痛苦。在DFS boost::graph期间,使用堆栈推送相邻顶点,这些顶点稍后将按推送顺序弹出
std::向量堆栈代码>//第94行boost\u 1\u 47\u 0 of depth\u first\u search.hpp
作为一种解决方法,您可以使用相同的push()和pop()界面重新定义此堆栈
,您可以做的是,当任何顶点
被推入堆栈
时,只需对堆栈
的元素进行排序,使半径最大的顶点始终位于顶部
换句话说,用您自己的优先级队列伪造堆栈接口
这将减轻您编写自己的DFS的痛苦。我最终遵循了中提供的逻辑,即
模板
结构权重:公共标准::二进制函数
{
布尔运算符(){
返回boost::get(boost::edge_-weight,lhs)>
boost::get(boost::边缘重量,rhs);
}
};
结构权重{};
名称空间提升{
模板
结构容器{
typedef std::多集类型;
};
模板
结构平行边特征{
typedef不允许\u平行\u边缘\u标签类型;
};
}
typedef邻接列表树;
为了确保out_边是根据半径排序的,我只将边权重定义为源顶点和目标顶点的平均半径
然而,问题是,创建图形时,“半径顶点”属性是动态的,并且是未知的,因此每当我更新边权重时,边顺序都是不变的
有人知道另一种方法吗
谢谢
-John我最终遵循了在提供的逻辑,即
模板
结构权重:公共标准::二进制函数
{
布尔运算符(){
返回boost::get(boost::edge_-weight,lhs)>
boost::get(boost::边缘重量,rhs);
}
};
结构权重{};
名称空间提升{
模板
结构容器{
typedef std::多集类型;
};
模板
结构平行边特征{
typedef不允许\u平行\u边缘\u标签类型;
};
}
typedef邻接列表树;
为了确保out_边是根据半径排序的,我只将边权重定义为源顶点和目标顶点的平均半径
然而,问题是,创建图形时,“半径顶点”属性是动态的,并且是未知的,因此每当我更新边权重时,边顺序都是不变的
有人知道另一种方法吗
谢谢
-JohnBGL中的广度优先搜索算法更适合您的用例;它比它的名字所暗示的更一般。您可以使用
push
、top
和pop
方法插入您自己的队列,这些方法可以执行您想要的任何排序。BGL中的广度优先搜索算法将更适合您的用例;它比它的名字所暗示的更一般。您可以使用push
、top
和pop
方法插入您自己的队列,这些方法可以执行您想要的任何顺序。请分别询问后续问题。谢谢请分别提出后续问题。谢谢
template <class StoredEdge>
struct weight : public std::binary_function<StoredEdge, StoredEdge, bool>
{
bool operator()(const StoredEdge &lhs, const StoredEdge &rhs) const {
return boost::get(boost::edge_weight, lhs) >
boost::get(boost::edge_weight, rhs);
}
};
struct weightS {};
namespace boost {
template <class ValueType>
struct container_gen<weightS, ValueType> {
typedef std::multiset<ValueType, weight<ValueType> > type;
};
template <>
struct parallel_edge_traits<weightS> {
typedef disallow_parallel_edge_tag type;
};
}
typedef adjacency_list<weightS, vecS, undirectedS, TreeVertexType> Tree;