文章目录
原文链接:https://www.yuque.com/cppdev/algo/toxenh
克鲁斯卡尔算法Kruskal
思想
为使生成树上边的权值之和达到最小,则应使生成树中每一条边的权值尽可能地小。
【理解】
- 每一轮选一个最小的边,将边的顶点并入生成树中,直到全部顶点都在生成树中
- 显然,第一步是不完整的,如果选的边构成了环怎么办?所以,并入最小边的时候,还需要考虑是否形成环
- 若该边并入后形成环:那就不并入了,继续找下一个最小边
- 若该边不会形成环:并入,继续
【如何判断是否会构成环?】https://blog.youkuaiyun.com/summer_dew/article/details/83036947
性能
O(eloge),适合稀疏图(边少的图)
另一个,普利姆Prim O(n^2):适合稠密图(边多的图)
博客:https://blog.youkuaiyun.com/summer_dew/article/details/81660483
举例
初始:将所有的顶点纳入考虑(变黄色),所有的边纳入考虑(蓝色)
- 选取所有边中(蓝边)最小的边f-e(权重为3),纳入生成树的边(变棕色)