码迷,mamicode.com
首页 > 编程语言 > 详细

Kruskal克鲁斯卡尔算法

时间:2019-08-18 23:58:32      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:最小   find   oid   sort   nbsp   efi   typedef   ++   turn   

克鲁斯卡尔算法依靠两个辅助数组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克鲁斯卡尔算法

标签:最小   find   oid   sort   nbsp   efi   typedef   ++   turn   

原文地址:https://www.cnblogs.com/strolling-leisurely/p/11374473.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!