kruskal(克鲁斯卡尔)算法,采用了边贪心的策略,其思想及其简洁,理解难度比prim要低很多。
kruskal算法的基本思想为:在初始状态时隐去图中的所有边,这样图中每个顶点都自成一个连通块。之后执行下面的步骤:
① 对所有边按边权从小到大进行排序。
② 按边权从小到大测试所有边,如果当前测试边所连接的两个顶点不在同一个连通块中,则把这条测试边加入当前最小生成树中;否则,将边舍弃。
③ 执行步骤②,直到最小生成树中的边数等于总顶点数减1 或是 测试完所有边时结束。而当结束时如果最小生成树的边数小于总顶点数减1,则说明该图不连通。
具体实现(用语言描述):
1. 首先定义一个结构体,在里面存放边的两个端点编号和边权,将该结构体定义成边。
2. 然后对所有边按照边权从小到大进行排序。
3.枚举所有边,在此利用并查集来检验每条边中的两个端点是否在同一集合中。若不在同一集合中,则将其所在的两个集合合并,并把当前测试边加入到最小生成树中;若在同一集合,则将该边丢弃。
4.一直执行步骤3, 直至最小生成树中的边数等于总顶点数减1 或 枚举完所有边。当结束时若最小生成树的边数不等于总顶点数减1,则说明图不连通。