//用到了并查集和堆排序解决最小生成树,思路就是权值边排序(堆排序),然后从最小权值边取起,边取边判定是否有回路(用并查集),有回路则放弃该边。思路相对简单,直接看代码。
#define MaxSize 100
typedef struct{
int a,b;//边的两个顶点
int weight;//边的权值
}Edge;//边结构体
int Find(int *parent,int x){
while(parent[x]>=0) x=parent[x];//并查集知识点:循环向上寻找下标为x顶点的根
return x;//返回根的下标
}
Edge edges[MaxEdge];//存储各条边
int parent[MaxVex];//并查集知识点:存储各顶点的父亲顶点
Void MiniSpanTree_Kruskai(MGraph G){
int i,n,m;
sort(edges);//这里的排序是经过重写的,按权值由小到大排序
for(i=0;i<G.vexnum;i++) parent[i]=-1;//初始化,各个顶点单独形成一个集合
for(i=0;i<G.arcnum;i++){//遍历每一条边
n=Find(parent.edges[i].a);
n=Find(parent.edges[i].b);
if(n!=m){//根节点不同,则不会构成环
parent[n]=m;
print("(%d->%d)",edges[i].a,edges[i].b);//访问
}
}
}
库鲁斯卡尔算法看起来简单,但用到了排序sort,因而时间耗费上取决边的多少,适合稀疏图。