我正在实施Prims算法。我有一个边缘矢量和它们的重量。 问题是,在插入之后,队列不会根据边缘的权重保持递增顺序。
相关代码如下: -
struct weightcomp // To be used solely for priority Queue...
{
bool operator()(Edge &E1, Edge &E2)
{
if(E1.weight > E2.weight)
return true;
}
};
std::priority_queue<Edge,std::vector<Edge>,weightcomp> PQ; // Priority Queue for Edges
void visit(std::vector<Edge> &PMST, int i) // PMST = Vector of edges and i = name of node
{
for(auto iter = PMST.begin();iter != PMST.end();++iter)
{
if((*iter).u == i || (*iter).v == i)
{
PQ.push((*iter));
(*iter).del = true; // Mark the vectors elements to be removed.
}
}
PMST.erase(std::remove_if(PMST.begin(),PMST.end(),[](Edge e){ return e.del;}),PMST.end()); // Delete the marked elements
}
我在实施中缺少什么?
答案 0 :(得分:0)
您有未定义的行为,因为您的比较并不总是返回值。
需要一些东西bool operator()(const Edge &E1, const Edge &E2) const
{
return E1.weight > E2.weight;
}
我在参数const
引用的位置因为比较不应该修改它们,而操作符const
因为它不会改变仿函数的状态。