C++ Boost图形库:Prim';带负边权的s算法

C++ Boost图形库:Prim';带负边权的s算法,c++,boost-graph,prims-algorithm,C++,Boost Graph,Prims Algorithm,我目前正在使用 prim_minimum_spanning_tree(g, parent.data()); 但是,我的图形确实包含具有负权重的边。这将导致以下错误 terminate called after throwing an instance of 'boost::wrapexcept<boost::negative_edge>' what(): The graph may not contain an edge with negative weight. te

我目前正在使用

    prim_minimum_spanning_tree(g, parent.data());
但是,我的图形确实包含具有负权重的边。这将导致以下错误

terminate called after throwing an instance of 'boost::wrapexcept<boost::negative_edge>'
what():  The graph may not contain an edge with negative weight.
terminate在抛出'boost::wrapexcept'实例后调用
what():图形可能不包含负权重的边。
这对我来说似乎有点奇怪,因为Prim的算法在负边权重下工作得非常好。为什么这仍然是BGL的一个问题? 还有,解决这个问题最简单的方法是什么?我必须在所有边的权重上加一个常数,使它们都为正,还是可以避免?
提前谢谢。

您可以将最小边的绝对值添加到所有边上,然后在prim的函数调用之后,从所有边上减去最小边的绝对值。@srt1104是的,可以,但是如前所述,我想避免使用@sehe No,因为Kruskal的实现没有提供将输出存储为前置映射(如果我错了,请纠正我),这是非常必要的。即使这对负权重有效,我认为转换Kruskal的输出所需的努力与在所有权重上加一个常数并再次减去它一样多afterwards@Manuel.mathKruskal在MST中输出一系列边。这基本上是所有的前辈(每个边的来源)。也许您是在暗示您喜欢将其写入由顶点id索引的随机访问容器的便利性。我建议,这仅适用于使用
vecS
作为顶点容器选择器的情况,我没有假设这一点。是的,这可能是一个优势。(我不知道Kruskal是否支持负权重)