MST实际上是贪心算法:把权值最小的边直接选择它就行了,而克鲁斯卡尔算法是更直截了当的贪心。
他一开始,直接把连通图中的所有顶点加入到最小生成树的集合中,因为最小生成树当中包含n个顶点,即连通图中的所有顶点都必须包括,所以它直接把n个顶点都包含在最小生成树中。
不过一开始,一条边都没有,它这个边集是空集,所以一开始它只包含n个顶点,一条边都没有,所以n个顶点每一个都是一个连通分量,彼此之间不连通
接下来,直接找边的权值最小的边,怎么找?将所有的边按照他的权值排个序,从最小的开始选。
加边的时候不能形成环,若有环出现,我们就不加他了,我们去掉他,找下一个最小的
选到所有的顶点都连通为止,或者说我们选出n-1条边为止
有3个5:
这里会出现环,不加它
最小生成树可以不一样:
两种算法比较:
Prim它是不断选择顶点加入生成树
Krusal是选择边
Prim是每一个顶点都要找其他的顶点去判断,那么顶点数相乘
Krusal是选择边,和顶点数无关,排序时也是按边的顺序,这里用堆排序算时间复杂度
Krusal边少时,比较快