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算法)(最小生成树算法)-贪心

(王道408考研数据结构)第六章图-第四节2:最小生成树之克鲁斯卡尔算法(思想代码演示答题规范)

克鲁斯卡尔算法

JS实现最小生成树之克鲁斯卡尔(Kruskal)算法

Kruskal算法 (克鲁斯卡尔)