定义
- 生成树:在无向图中,一个连通图的最小连通子图,不能构成回路;
- 最小生成树:权值最小的生成树(不唯一),实现方式有克鲁斯卡尔算法和普里姆算法。
克鲁斯卡尔算法
- 算法思想:每次选最小权值的边,要手动的保证不存在环;
- 判断是否构成环:利用并查集,若构成环,则一条边的两个顶点在同一个集合中;
- 定义用于构建最小生成树的Edge:
struct Edge{
int _srci;
int _dsti;
W _w;
Edge(int srci, int dsti, W& w)
:_srci(srci)
, _dsti(dsti)
, _w(w){
}
//此处重载的operator>为类的成员函数
bool operator>(const Edge& e)const {
return _w > e._w;
}
};
- 具体做法为:初始化最小生成树----构建小根堆----让图中所有的边入队----取堆顶元素,判断是否构成环,若不构成环,则添加边;
W Kruskal(Self& minTree){
//初始化最小生成树
size_t n = _vertex.size();
minTree._vertex = _vertex;
minTree._indexMap = _indexMap;
minTree._matrix.resize(n);