克鲁斯卡尔算法依靠两个辅助数组parent[ ] 和edges[ ].
parent[]数组用于实现并查集操作,即查询一个顶点所在集合的根节点,以及将两个集合合并成为一个集合。
edges[]数组作为图中边的集合,其中各个边按照权值大小升序排序,这样克鲁斯卡尔算法只需依次遍历edges[]数组便可依次向树中
添加一个当前权值最小的边,另外借助parent[]数组的查询操作保证加入的边不会造成环。
1 #define MAXSIZE 100;
2 typedef struct{
3 int a; //a,b为边的两个顶点
4 int b;
5 int weight; //这条边的权值
6 }Edge; //边结构体
7
8 int find(* parent,int a) //查找顶点a的所在集合的根结点
9 {
10 while(parent[a] > 0) //paren数组中根节点的值等于-1
11 a = parent[a];
12 return a;
13 }
14 int parent[MAXSIZE]; //父亲顶点数组 实现并查集操作
15 Edge edges[MaxEdge]; //边数组
16
17 void Kruskal(MGrahp G)
18 {
19 int i,a,b;
20 sort(deges); //对图中的边按权值大小升序排列
21 for(i = 0;i < G.vexnum;++i)
22 parent[i] = -1; //初始化 各个顶点成为一个集合
23 for(i = 0;i < G.arcnum;++i){ //扫描每条边
24 a = find(parent,edges[i].a);
25 b = find(parent,edges[i].b);
26 if(a != b){ //如果该条边的两个顶点不在一个集合中,将这两个集合合并
27 parent[a] = b;
28 printf("%d->%d",edges[i]a,edges[i].b) //打印这条边
29 }
30 }
31 }