算法-20-最小生成树+贪心算法(Prim+Kruskal)

目录

1、定义

1.1、约定

1.2、贪心算法+切分定理

2、加权无向图的数据类型

2.1、Edge类

2.2、EdgeWeightedGraph

3、最小生成树--Prim算法

3.1、Prim算法--方式一

3.2、Prim算法---方法二

4、最小生成树算法---Kruskal算法


1、定义

加权图是一种为每条边关联一个权值或是成本的图模型。

一幅加权图的最小生成树(MST)树中所有边的权值之和最小 的生成树。

1.1、约定

在计算图的最小生成树的过程中,因为图的多种特殊情况,比如负的权值,不连通的情况,会让我们去做多余的处理,为了我们更好的理解最小生成树的算法, 我们做了下面的约定:

  1. 只考虑连通图。如果一幅图是非连通的, 我们只能使用这个算法来计算它的所有连通分量的最小生成树,合并在一起称其为最小生成 森林。
  2. 边的权重不一定表示距离
  3. 边的权重可能是 0 或者负数。
  4. 所有边的权重都各不相同。如果不同边的权重可 以相同,最小生成树就不一定唯一了。

1.2、贪心算法+切分定理

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解

而我们图的最小生成树算法就是利用了贪心算法的原理,我们只要把图中连接每个点的最小权值的边找出来,然后并让他们连成一棵树,并且不能出现环或者多棵树我们就算完成了。

而切分定理就是在贪心算法的基础上,从起点s出发,把起点s和其他点分成两部分,然后找出起点s和另外一部分连接的最短路径(也叫横切边)。现在就是两个点,然后找出另外的部分连接这两个点的最短路径(横切边)连成三个点,这样不断持续下去,就能生成我们的最小生成树。

切分定理:图的一种切分是将图的所有顶点分为两个非空且不重叠的两个集合。横切边是一条连接 两个属于不同集合的顶点的边。

2、加权无向图的数据类型

这里我们求的加权无向图的最小生成树,我们首先要表示出加权无向图的数据类型, 然后我们才能做下一步的计算。

Edge类来存储边、边的权值、边的两个顶点。

EdgeWeightedGraph 类 中有一个 数据链表,数组用来存储每个顶点,链表用来存储每个顶点相连的边。

2.1、Edge类

public class Edge implements  Comparable<Edge> {

    private final int v;
    private 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值