我是C ++初学者,我试图实现Kruskal算法来查找加权(连接)无向图的最小生成树。
我首先创建了一个.mat-sort-header-container {
display:flex;
justify-content:center;
}
类。
WeightedGraph
最初我在上面定义了名为class WeightedGraph
{
private:
int V;
map<pair<int, int>, int> w_map;
public:
// constructors and other member functions.
};
的私有数据成员,用于保存每条边的权重。也就是说,如果w_map
是图形边缘,则{u, v}
会提供对此边缘权重的引用。
Kruskal算法的一个步骤是通过非减少权重的顺序对图中的所有边进行排序。
据我了解,w_map[{u, v}]
仅按键排序(使用默认的map
运算符或使用用户定义的二元谓词)。 <
无法直接按map
排序。mapped_value
如果我错了,请纠正。
一个选项是定义和使用上面的w_map
set<pair<pair<int, int>, int>
(让它命名为w_set
),为它提供我们自己的谓词,以便每个元素{{1 } a
根据w_map
(其权重)的值复制到w_set
。
所以如果我们的谓词是这样的话:
a.second
然后我们可以按如下方式定义bool Comparer(const pair<pair<int, int>, int> &a, const pair<pair<int, int>, int> &b)
{
return a.second < b.second;
}
:
w_set
并在成员函数中使用它来访问私有成员set<pair<pair<int, int>, int>, decltype(Comparer)*> w_set(Comparer);
的迭代器。
但是
我在想,如果不是
,该怎么办?w_map
存储边缘和重量。我们直接使用与map
相同类型的一组作为w_set
的数据成员。在这种情况下,在每个元素插入时,集合将按预期排序。
所以我做的就是这个:
WeightedGraph
但我收到以下错误:
class WeightedGraph
{
private:
int V;
set<pair<pair<int, int>, int>, decltype(Comparer)*>w_sorted(Comparer);
public:
// constructors and other member functions.
};
无法识别Unknown type name 'SortByWeight'
作为SortByWeight
参数传递给comp
构造函数的内容。
老实说,我不知道自己做错了什么。我想我会搞一些非常明显的东西(可能有范围),但我无法弄清楚是什么。