1.prim算法精讲
题目链接:53. 寻宝(第七期模拟笔试)
文章讲解:代码随想录
思路:计算最小生成树所有边的权值
最小生成树是所有节点的最小连通子图,即:以最小的成本(边的权值)将图中所有节点链接到一起。
图中有n个节点,那么一定可以用n-1条边将所有节点连接到一起,如何选取n-1条边使得图中所有节点连接到一起,并且边的权值和最小呢。prim算法是从节点的角度采用贪心的策略每次寻找距离最小生成树最近的节点并加入到最小生成树中。
prim算法核心就是三步:
1、第一步:选距离生成树最近节点
minDist数组用来记录每一个节点距离最小生成树的最近距离,来寻找距离最小生成树最近的节点,加入到最小生成树,刚开始还没有最小生成树,所以随便选一个节点加入就好
2、第二步:最近节点加入生成树
3、第三步:更新非生成树节点到生成树的距离(即更新minDist数组)
最后我们就生成了一个最小生成树,绿色的边将所有节点链接到一起,并且保证权值是最小的,因为我们在更新minDist数组的时候,都是选距离最小生成树最近的点加入到树中。
minDist数组是记录了所有非生成树节点距离生成树的最小距离,要求最小生成树里边的权值总和就是把最后的minDist数组累加一起。
扩展:打印出来最小生成树的每条边,此时我们就需要把最小生成树里每一条边记录下来。
1、用什么结构来记录
如果记录边,其实就是记录两个节点就可以,两个节点连成一条边,使用一维数组就可以记录。parent[节点编号] = 节点编号,这样就把一条边记录下来了。
2、如何记录
根据minDist数组,选组距离生成树最近的节点加入生成树,那么minDist数组里记录的其实也是最小生成树的边的权值。在更新minDist数组的时候,去更新parent数组来记录一下对应的边。
2.kruskal算法精讲
题目链接:53. 寻宝(第七期模拟笔试)
文章讲解:代码随想录
思路:
Kruskal,同样可以求最小生成树。prim 算法是维护节点的集合,而 Kruskal 是维护边的集合。
kruskal的思路:
边的权值排序,因为要优先选最小的边加入到生成树里
遍历排序后的边
如果边首尾的两个节点在同一个集合,说明如果连上这条边图中会出现环
如果边首尾的两个节点不在同一个集合,加入到最小生成树,并把两个节点加入同一个集合