克鲁斯卡尔算法依靠两个辅助数组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 }
原文地址:https://www.cnblogs.com/strolling-leisurely/p/11374473.html
时间: 2024-10-08 16:32:05