我正在尝试实现kruskal的mst算法。我试图根据每条边权重的递增顺序对向量边中的边进行排序。但在对完整向量进行排序后,出现了分割错误。但是如果我改变<(小于)符号到>(大于)在我的mycomp函数中,这样它将按降序排序,它正在正确执行。为什么会这样?我认为这里保持了严格的弱排序。谢谢你。
#include<algorithm>
#include<iostream>
#include<vector>
#define all(container) container.begin(),container.end()
bool mycomp(const Edge* a,const Edge* b)
{return a->weight<b->weight;}
void kruskalmst(Graph* graph)
{vector<Edge*> result;int i=0;
sort(all(graph->edge),mycomp);
}
for循环的条件:
i<graph->e,result.size()<graph->v-1
使用逗号操作符。根据ISO标准5.18 pt.1:"用逗号分隔的一对表达式从左到右求值;左边的表达式是一个被丢弃的值表达式"。
这意味着你循环,不考虑如果i<graph->e
,所以你可以超越你的迭代器的结束。
是的,要解决这个问题,您还需要用逻辑运算符替换逗号。若graph->e
为边数,则连接器应为&&
。