【问题标题】:Implementing a graph with vectors using boost使用 boost 实现带有向量的图
【发布时间】:2014-12-11 01:15:37
【问题描述】:

我正在尝试使用 boost 和三个独立的向量来实现一个图形:

std::vector<std::string> vertex_array;
std::vector<Edge> edge_array;
std::vector<int> weight_array;

边缘定义为:

typedef std::pair<std::string, std::string> Edge;

我的图表定义为:

typedef adjacency_list<vecS, vecS, undirectedS> Graph;

数组都填充了我从输入文件中获得的数据,因此顶点向量中的第一个元素类似于“A”,边向量中的第一个元素类似于(B,C)权重向量中的第一个元素将是边向量中第一条边的权重,在这种情况下为 BC。

问题是,我对 C++ 不是很流利,而且我对 boost 和图形也很陌生。我试过查看 boost 网站上的示例代码,但它们都使用数组而不是向量。我确实尝试了这个示例代码:

Graph g(edge_array, edge_array + sizeof(edge_array) / sizeof(Edge), num_vertices);

我确实有一个 num_vertices 变量,但它仍然给我一个错误。

有谁知道如何创建一个包含边、顶点和权重向量的图形,我最终可以使用 Dijkstra 的 boost 版本?

对不起,如果这个问题真的很模糊或基本,我真的对使用 boost 和实现图表一无所知。

【问题讨论】:

  • 试试Graph g(&amp;edge_array[0], &amp;edge_array[0] + edge_array.size(), num_vertices);
  • @MattMcNabb 它去掉了红色波浪线,但它给了我编译器错误 C2182:非法使用类型 'void'

标签: c++ boost vector graph


【解决方案1】:

来自docs

Graph 类型必须是 Vertex List Graph 和 Incidence Graph 的模型。

an example too 使用 adjacency_list 图表。

当您在该示例中将 listS 替换为 vecS 时,会返回完全相同的响应(尽管我还没有检查所有代码以了解此更改的完整性)


typedef adjacency_list<vecS, vecS, undirectedS> Graph;

从这一行来看,边缘似乎没有 weight 属性。如果没有这些信息,Dijkstra 会很困惑地选择最佳路径。快速浏览一下文档,我认为您可以提供一个外部 weight 映射。另请注意:

当所有边的权重都等于 1 时,使用广度优先搜索而不是 Dijkstra 算法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多