Kruskal算法的基本思想是,将图中的节点分类,分成两个集合,分别表示成S和T其中S是不在生成树中的节点集合,T是在生成树中的节点集合。刚开始的时候,T中只有源节点一个节点。同时将图中的所有边按照权值排序。然后每次向图中添加一条权值最小的边,同时满足,这条边的一个节点在S中一个节点在T中。这样循环,直到树中有了n-1条边为止。实现的代码如下:
/**
这边使用并查集实现Kruskal算法,并没有使用最小堆,代替的使用了一个排序的方法对边进行排序,然后从小到大的进行取出就行了。
图的表示方法是邻接表表示,不再使用邻接矩阵表示。
**/
#include<iostream>
#include <algorithm>
#include <vector>
using namespace std;
#define MAXNODES 10000 //定义了最大的节点数
//边类
class Edge
{
public:
double cost; //边的权值
int head,tail ; //这条边的另一个节点
Edge * next ; //指向这个节点的下一条边。
Edge (int head,int tail ,double cost ):head(head),tail(tail),cost(cost){}
bool operator <(Edge & e)
{
return this->cost < e.cost;