1、最小生成树(MST)
a、连通图生成树包含所有的顶点,并且含尽可能少的边。权值之和最小的生成树称为最小生成树。
b、生成最小生成树的算法主要有Prim算法和Kruskal算法,基于贪心算法的策略。
c、生成的最小生成树不一定唯一,各边权值不相同时,最小生成树唯一。
2、Prim(普里姆)算法
a、Prim算法适合稠密图(边相对于结点更多)
b、初始化是一个结点。
c、原理:
相当于把所有结点分为两大类顶点集U(已经确定的结点)和V(未被确定的结点),U和V之间有边相连,每次找这些边中最小权值的边,将该边对应的V中的结点再添加到U中,继续重复操作,直到全部结点都为U中的结点。最小生成树构建完成。Prim算法的生成树不唯一(每次选择最小边的时候,可能存在多条同样权值的边可选,此时任意选其一就可以)。
d、因为时间复杂度只和结点数V有关,所以适合稠密图。时间复杂度是O(|V|2)
3、Kruskal(克鲁斯卡尔)算法
a、Kruskal算法适合稀疏图(结点相对于边更多)
b、初始化是把所有结点加入到顶点集中,根据要求挑选下一条边。
c、原理:
相当于把所有边按照从小到大顺序排好,依次从中抽取出最小权值的边,如果添加一个边之后,这个边和已经确定的边形成了回路,则将这个边舍弃,因为不满足最小生成树的要求。直到最后形成n-1条边(n是总结点数),则构建完成。
其中判断是否构成回路利用到了并查集,排序用到Sort()函数。
d、时间复杂度只与边有关,所以适合稀疏图。
其中边数是|E|,因为算法中用到了堆排序,堆排序的时间复杂度是Log|E|,所以总的时间复杂度是O(|E|log|E|)。