【发布时间】:2014-06-04 22:14:21
【问题描述】:
我在 C++ from this page 中复制了 dijkstra 的算法,并对其进行了修改以适合我的图形表示类。基本上,我只用我自己的结构edge替换了std::pair作为std::set的模板参数:
struct edge
{
int vertex;
unsigned long weight;
edge(int v = 0, unsigned long wt = 0) : vertex(v), weight(wt) { }
bool operator<(const edge& e2) const
{
//return weight < e2.weight;
return weight < e2.weight || ((e2.weight >= weight) && vertex < e2.vertex);
}
};
但是,我必须实现 operatore2.weight >= weight(所以e2.weight实际上可能比weight更大)只要vertex < e2.vertex,更长的语句就会返回true。但是顶点数没有出现在 Dijkstra 算法的定义中。
那么为什么程序只使用第二个 return 语句就可以正常工作呢?
【问题讨论】:
-
int vertex代表什么? -
链接页面中的
second与std::pair相同。 -
在您链接的页面中,第二个元素是
vertex_t。它使用int,所以它有一个唯一标识符 - int 的大小没有意义(所以在比较中使用它没有意义) -
该页面中的
vertex_t是在while循环开始时从std::set弹出的顶点的当前处理邻居。它的价值很重要,因为它只是表示weight_t所指的顶点。但我同意比较没有意义 - 但是,就像我说的那样,我的operator<中的第一个 return 语句导致我的程序在某些在线法官的最大输入测试中失败(给出错误答案)。这个测试包含超过 5k 的顶点和超过 100k 的边,所以我很难检查它在运行时的行为。 -
这可能与
set是根据其元素上的某些operator<()自动排序的事实有关,因此在这种情况下,在使用set的情况下,大小为vertex可能包含有关其与其他元素相关的排序的有用信息?
标签: c++ algorithm set graph-algorithm dijkstra