Kruskal算法是求图最小生成树的一种算法,另外一种是Prim算法。
Kruskal算法思想:Kruskal算法按照边的权重(从大到小)处理它们,将边加入最小生成树中,加入的边不会对已经加入的边构成环,直到树中含有V-1条边为止。
源代码示例:
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#include <functional>
using namespace std;
class Edge
{
public:
Edge(size_t _v, size_t _w, double _weight) : v(_v), w(_w), weight(_weight) {}
double getWeight() const { return weight; }
size_t either() const { return v; }
size_t other(size_t v) const
{
if (v == this->v)
return this->w;
else if (v == this->w)
return this->v;
else
{
cout << "error in Edge::other()" << endl;
exit(1);
}
}
void print() const{ cout << "(" << v << ", " << w << ", " << weight << ") "; }
private:
size_t v, w; // 两个顶点
double weight; // 权重
};
/// 加权无向图
class EdgeWeithtedGraph
{
public:
EdgeWeithtedGraph(size_t vertax_nums) : vertaxs(vertax_nums), edges(0), arr(vertax_nums) {}
void addEdge(const Edge e);
vector<Edge> adj(size_t v) const { return v < arrSize() ? arr[v] : vector<Edge>(); }
vector<Edge> allEdges() const; // 返回加权无向图的所有边
size_t arrSize() const { return arr.size(); }
size_t vertax() const { r