Kruskal克鲁斯卡尔算法
Posted strolling-leisurely
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kruskal克鲁斯卡尔算法相关的知识,希望对你有一定的参考价值。
克鲁斯卡尔算法依靠两个辅助数组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
以上是关于Kruskal克鲁斯卡尔算法的主要内容,如果未能解决你的问题,请参考以下文章
克鲁斯卡尔算法(Kruskal算法)(最小生成树算法)-贪心
克鲁斯卡尔算法(Kruskal算法)(最小生成树算法)-贪心