【发布时间】:2021-04-12 12:44:31
【问题描述】:
我想在文件中的图形上运行 prim,但是对于某些输入,prim_minimum_spanning_tree 给了我一个分段错误。 当我使用 valgrind 运行它时,不会发生段错误,但 valgrind 指示存在错误(“无效读取大小为 8”),但它只在某些图表上显示它们。
我对使用 boost 很陌生,我怀疑我初始化图表错误。
std::pair<int,int> *edges = new std::pair<int,int>[num_edges];
double *weights = new double[num_edges];
// read edges and weights into arrays
readin(argc, argv, edges, weights);
typedef adjacency_list<vecS, vecS, undirectedS, no_property, property<edge_weight_t, mat_t>> Graph;
Graph G(num_nodes);
for(int i = 0; i < num_edges; i++){
// check input
assert(edges[i].first >= 0 && "zero first");
assert(edges[i].first < num_nodes && "numvertices first");
assert(edges[i].second >= 0 && "zero second");
assert(edges[i].second < num_nodes && "numvertices second");
// add edge
auto edge_iterator = add_edge( edges[i].first,edges[i].second, weights[i], G);
}
//create parent vector to store solution
std::vector<graph_traits<Graph>::vertex_descriptor> *parents =
new std::vector<graph_traits<Graph>::vertex_descriptor>(num_vertices(G));
//run prim
prim_minimum_spanning_tree(G, &(parents->at(0)));
delete parents;
delete[] edges;
delete[] weights;
我尝试用 gdb 调试它,但我找不到错误...
更新: 感谢您的帮助!
我终于找到了错误:它与 readin 函数无关。 问题是当图形包含自循环时,提升中的 prim 不起作用...... (或至少只有在那个错误发生时)
来自 boost 文档: " Boost.Graph 中实现的算法不会在具有平行边的图上产生正确的结果。"
我不认为segfault被认为是“不正确的结果”......
【问题讨论】:
-
修复Valgrind错误,您还可能会修复分段错误。 span>
标签: c++ boost graph segmentation-fault minimum-spanning-tree