Kruskal最小生成树算法中索引逻辑、变量e的作用及循环终止条件解析
关于Kruskal算法实现的三个关键点解析
嘿,咱们来一步步拆解你疑惑的这几个点,都是Kruskal算法里的核心细节:
1. 为什么两个节点父节点不同时要执行e += 1?
这里的e是用来统计已经成功加入最小生成树(MST)的有效边数量。Kruskal算法的核心规则是:只有当一条边连接的两个节点属于不同的连通分量时,这条边才不会形成环,是能被加入MST的有效边。
当x != y(两个节点的父节点不同),说明这条边符合要求,加入MST后,我们就把e加1,记录新增了一条有效边。
2. while循环为什么要依据e的值终止?
这是由最小生成树的特性决定的:一个包含v个顶点的连通图,它的最小生成树恰好需要v-1条边——因为树的定义就是「无环且连通」,边数永远比顶点数少1。
代码里的while e < self.v - 1意思就是:只要选到的有效边还没到v-1条,就继续找;一旦凑够v-1条边,整个MST就已经构建完成了,剩下的边不用再检查,直接终止循环就行,这样能大幅提升算法效率。
3. 代码中索引i的作用是什么?
i就是遍历排序后边列表的指针。你看代码里先把所有边按权重从小到大排序了:self.graph = sorted(self.graph, key=lambda graph:graph[2]),Kruskal算法要求我们从权重最小的边开始依次尝试加入MST。
i从0开始,每循环一次就i += 1,相当于依次取出排序后的第0、1、2...条边,检查这条边能不能加入MST。它的作用就是帮我们按顺序遍历所有候选边。
再串一遍整个流程,帮你加深理解:
- 先把所有边按权重升序排序,保证我们先选最小权重的边
- 初始化
i=0(从第一条边开始)、e=0(还没选任何有效边) - 取出当前
i对应的边,检查两个端点是否在同一连通分量 - 如果不在同一分量:把这条边加入MST,合并两个分量,同时
e +=1 - 不管这条边能不能用,
i都要加1,去检查下一条边 - 直到
e等于v-1,MST构建完成,退出循环
内容的提问来源于stack exchange,提问作者VRM




