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);