C++ 增压图CRS:体积重量和Dijkstra
我试图尽可能高效地构建一个图,因为我不需要在运行时更改我的图,所以我选择了C++ 增压图CRS:体积重量和Dijkstra,c++,boost,graph,C++,Boost,Graph,我试图尽可能高效地构建一个图,因为我不需要在运行时更改我的图,所以我选择了boost::compressed\u sparse\u row\u graph。现在问题很简单:如何向边添加权重并调用boost::dijkstra_最短路径 到目前为止,我已经完成了创建一个图表,但我不知道如何继续 我的要求是:尽可能少地浪费内存和时间。我面对的是一些节点数可能达到10^6的图。我正在关注这个条目,但我担心,正如我在维基中看到的那样,属性映射、索引映射和公司将成为我的程序的额外负担 您认为有没有一种方法
boost::compressed\u sparse\u row\u graph
。现在问题很简单:如何向边添加权重并调用boost::dijkstra_最短路径
到目前为止,我已经完成了创建一个图表,但我不知道如何继续
我的要求是:尽可能少地浪费内存和时间。我面对的是一些节点数可能达到10^6的图。我正在关注这个条目,但我担心,正如我在维基中看到的那样,属性映射、索引映射和公司将成为我的程序的额外负担
您认为有没有一种方法可以最小化内存占用
谢谢你的帮助
// Properties: weights
typedef boost::property<boost::edge_weight_t, int> edge_weight;
// The graph itself as a compressed sparse row matrix
typedef boost::compressed_sparse_row_graph<boost::bidirectionalS, boost::no_property, edge_weight> boost_graph;
// Vertex iterator
typedef boost::graph_traits<boost_graph>::vertex_iterator vertex_iterator;
// Edge iterator
typedef boost::graph_traits<boost_graph>::edge_iterator edge_iterator;
// Adjacent nodes iterator
typedef boost::graph_traits<boost_graph>::adjacency_iterator adjacency_iterator;
typedef boost::graph_traits<boost_graph>::out_edge_iterator outward_iterator;
typedef boost::graph_traits<boost_graph>::in_edge_iterator inward_iterator;
int main(int argc, const char * argv[])
{
std::vector<std::pair<std::size_t, std::size_t>> graph_edges;
std::vector<int> edge_weight;
graph_edges.push_back(std::make_pair( 0, 1)); edge_weight.push_back(1);
graph_edges.push_back(std::make_pair( 0, 3)); edge_weight.push_back(2);
graph_edges.push_back(std::make_pair( 1, 4)); edge_weight.push_back(2);
graph_edges.push_back(std::make_pair( 2, 4)); edge_weight.push_back(3);
graph_edges.push_back(std::make_pair( 3, 4)); edge_weight.push_back(1);
graph_edges.push_back(std::make_pair( 4, 5)); edge_weight.push_back(1);
graph_edges.push_back(std::make_pair( 4, 6)); edge_weight.push_back(5);
graph_edges.push_back(std::make_pair( 5, 7)); edge_weight.push_back(4);
graph_edges.push_back(std::make_pair( 7, 8)); edge_weight.push_back(1);
graph_edges.push_back(std::make_pair( 8, 9)); edge_weight.push_back(3);
graph_edges.push_back(std::make_pair( 8, 11)); edge_weight.push_back(2);
graph_edges.push_back(std::make_pair( 8, 12)); edge_weight.push_back(3);
graph_edges.push_back(std::make_pair( 9, 10)); edge_weight.push_back(2);
graph_edges.push_back(std::make_pair(12, 10)); edge_weight.push_back(4);
// Create the graph
boost_graph graph(boost::edges_are_unsorted_multi_pass, graph_edges.begin(), graph_edges.end(), 13);
// ...
}
//属性:权重
typedef boost::属性边\权重;
//图本身是一个压缩的稀疏行矩阵
typedef boost::压缩的_稀疏的_行图boost_图;
//顶点迭代器
typedef boost::graph_traits::顶点迭代器顶点迭代器;
//边迭代器
typedef boost::graph_traits::edge_迭代器edge_迭代器;
//相邻节点迭代器
图形特征::邻接迭代器邻接迭代器;
typedef boost::graph_traits::out_edge_iterator out_iterator;
typedef boost::graph_traits::in_edge_iterator introw_iterator;
int main(int argc,const char*argv[]
{
std::向量图_边;
std::向量边权;
图边。推回(std::make_pair(0,1));边重。推回(1);
图边。推回(标准::生成一对(0,3));边重。推回(2);
图边。推回(std::生成一对(1,4));边重。推回(2);
图边。推回(标准::生成一对(2,4));边重。推回(3);
图边。推回(标准::生成一对(3,4));边重。推回(1);
图边。推回(标准::制作一对(4,5));边重。推回(1);
图边。推回(标准::制作一对(4,6));边重。推回(5);
图边。推回(标准::制作一对(5,7));边重。推回(4);
图边。推回(标准::制作一对(7,8));边重。推回(1);
图边。推回(标准::形成一对(8,9));边重。推回(3);
图边。推回(std::生成一对(8,11));边重。推回(2);
图边。推回(标准::制作一对(8,12));边重。推回(3);
图边。推回(标准::制作一对(9,10));边重。推回(2);
图边。推回(标准::制作一对(12,10));边重。推回(4);
//创建图形
boost_图形(boost::edges_是未排序的多过程,graph_edges.begin(),graph_edges.end(),13);
// ...
}
使用连续容器(如std::vector)可以批量定义图形:
boost_graph graph(boost::edges_are_unsorted_multi_pass, graph_edges.begin(), graph_edges.end(), edge_weight.data(), 13);