最小生成树的两种实现

Kruskal算法的实现:

根据最一般的Kruskal 算法的实现原理,本人设计并实现的算法如下:首先在此算法中,选边的过程中,要首先对存在边按权值按非递减的顺序排列,以顺序判断并加入最小生成树边的集合。 因此设计数据结构:

typedef struct {

    int u, v;   //对应权值所对应的两顶点

    short w;    //权值

} myedge, *Eptr;

在此数据结构中,alg_edge 指向所有边的数据集合,为在堆上的一维数组,并对此数组用快速排序进行排序。得到的结果为选边并记录入 MST[g >size-1] 这一存放最小生成树的数组做好准备。

vertag 数组,首先标记各顶点属于不同的集合,亦即图中每个顶点属于不同的集合。然后自权值最小边开始,凡是顶点属于不同的集合的边均可选入,选入后,两顶点所属的不同集合,合并成一个集合,可以肯定在所有边都被检查一遍后,可被选入的边数为 V-1  ,以 V 表示图的顶点数。恰好 MST 数组记录的正是最小生成树的各边,因为边已按非递减的顺序检查。

快排虽然具有不稳定性,但对于最小生成树的找到无影响,因为最小生成树的权值相同,如果排列顺序变化均能,一方入最小生成树边,则说明最小生成树不唯一。

Prime算法的实现:

Prime算法极其类似 Dijikstra 算法,两者都要维护更新不在已知满足要求(分别对应可以加入最小生成树和已知最短路径)的顶点集合中顶点的 key 值,并且从中算出最小值,作为下一个找到的满足要求的顶点,且并入已知的满足要求顶点的集合。同时,唯一的区别是, Dijikstra 算法仅需知道对应顶点到源点的距离,而 Prime 算法则需知道对应顶点到已在最小生成树中各顶点的最小可能距离。两个 key 值都会随顶点的加入,同步更新,同时也是期望得到的结果数据集合中必不可少的数据之一。因此设计数据结构如下:

typedef struct {

    int ver;    //起始顶点

    int key;    //权值

    int end;    //对应权值所连接的顶点

} myvertex, *Vptr;

此时的数据中均有两个顶点,和一个权值,乍一看与Kruskal 算法的数据结构相似,但两者在运用时,初始化数组的出发点一个是权值 w ,另一个是顶点 ver ,亦即在建立选边的初始数据时, Kruskal 算法需要建立一个边数大小的数组,然后从中选边,然而 Prime 算法仅需建立一个顶点数大小的数组,然后从中选边,类似于 Dijikstra 算法;虽然最终选边的依据都是边权值( Kruskal 算法的这一步在排序中体现)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值