代码随想录算法训练营第57天|最小生成树 prim算法 kruskal算法

最小生成树:所有节点的最小连通子图,即:以最小的成本将所有的点连接到一起。

prim算法:

采取贪心的策略,每次都将距离当前最小生成树最近的节点加入最小生成树,以此类推,直到所有节点都加入最小生成树。

prim三部曲:1.找到距离最小生成树最近的节点;2.将该节点加入最小生成树中;3.更新不在最小生成树中的节点到最小生成树的距离。

思路:遍历所有的点,每次选取一个点加入最小生成树。第一次就选取节点1加入最小生成树,然后遍历一遍所有的点,看这个点和他相连的点的距离,存入数组,如果出现了比存入数组的数更小的距离出现,则进行替换,为了保证能够进行替换,所以初始值要赋为有效值内的最大值。直到所有的点都被标为访问过之后,即遍历过一遍之后,最小生成树就找到了,储存在数组内的就是构成最小生成树的距离,他们的和就是最小生成树的权值。若要打印最小生成树的每条边,则需要每次在找到的距离最小生成树最近的点之后,将这条边加入数组。使用一维数组记录边时要parent[终点]=起点,不然会发生覆盖。

kruskal算法:

思路:因为要先把权值较小的边放进生成树里,所以先按边的权值对边进行排序。如果这条边的两个点都在生成树中,那么就跳过这条边,如果只有一个边在生成树中或者都不在,就把这条边加入到最小生成树中。最开始所有边都是自己一个集合,加入生成树后将两个点并入同一个集合,也就是说 如果两条边在同一集合中,那么就出现了环,如果不是,则可以加入。所以在此算法中,可以用到并查集。要将最小生成树的边进行输出的话,直接在找到时进行存储就可以了,比prim算法简单一些。

两者区别:

prim算法通过点来寻找最小生成树,而kruskal是通过边来寻找最小生成树。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值