最小生成树:所有节点的最小连通子图,即:以最小的成本将所有的点连接到一起。
prim算法:
采取贪心的策略,每次都将距离当前最小生成树最近的节点加入最小生成树,以此类推,直到所有节点都加入最小生成树。
prim三部曲:1.找到距离最小生成树最近的节点;2.将该节点加入最小生成树中;3.更新不在最小生成树中的节点到最小生成树的距离。
思路:遍历所有的点,每次选取一个点加入最小生成树。第一次就选取节点1加入最小生成树,然后遍历一遍所有的点,看这个点和他相连的点的距离,存入数组,如果出现了比存入数组的数更小的距离出现,则进行替换,为了保证能够进行替换,所以初始值要赋为有效值内的最大值。直到所有的点都被标为访问过之后,即遍历过一遍之后,最小生成树就找到了,储存在数组内的就是构成最小生成树的距离,他们的和就是最小生成树的权值。若要打印最小生成树的每条边,则需要每次在找到的距离最小生成树最近的点之后,将这条边加入数组。使用一维数组记录边时要parent[终点]=起点,不然会发生覆盖。
kruskal算法:
思路:因为要先把权值较小的边放进生成树里,所以先按边的权值对边进行排序。如果这条边的两个点都在生成树中,那么就跳过这条边,如果只有一个边在生成树中或者都不在,就把这条边加入到最小生成树中。最开始所有边都是自己一个集合,加入生成树后将两个点并入同一个集合,也就是说 如果两条边在同一集合中,那么就出现了环,如果不是,则可以加入。所以在此算法中,可以用到并查集。要将最小生成树的边进行输出的话,直接在找到时进行存储就可以了,比prim算法简单一些。
两者区别:
prim算法通过点来寻找最小生成树,而kruskal是通过边来寻找最小生成树。