Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有优先级队列的BGL DFS访问者_C++_Boost_Graph_Depth First Search_Boost Graph - Fatal编程技术网

C++ 具有优先级队列的BGL DFS访问者

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

我有一棵树(在图形意义上)表示一棵树(在物理意义上)。树表示为BGL邻接列表,其中每个顶点都包含半径和位置属性,即,我的图在表格中定义

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_边是根据半径排序的,我只将边权重定义为源顶点和目标顶点的平均半径

然而,问题是,创建图形时,“半径顶点”属性是动态的,并且是未知的,因此每当我更新边权重时,边顺序都是不变的

有人知道另一种方法吗

谢谢


-John

BGL中的广度优先搜索算法更适合您的用例;它比它的名字所暗示的更一般。您可以使用
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;