贪心算法之克鲁斯卡尔(Kruskal)算法
算法思想
为使生成树上边的权值之和达到最小,则应使生成树中每一条边的权值尽可能地小。
具体做法: 先构造一个只含 n 个顶点的子图 SG,然后从权值最小的边开始,若它的添加不使SG 中产生回路,则在 SG 上加上这条边,如此重复,直至加上 n-1 条边为止。n-1这个数字很关键,使其不存在回路
判断是否产生回路可以用并查集
每次用选择权边最小的边可以用优先队列
算法伪代码
输入:edgelist数组,大小n
输出:打印
Kruskal(edgelist,n){
sort(edgelist);//按照权值排序,可以使用优先队列实现
for i = 1 to n
makeset(i);//将各个定点各自分成一个单元,然后再对各个单元进行合并
count = 0;
i = 1;
while(count<n-1){
if(findset(edgelist[i].v) != findset(edgelist[i].w)){//该条语句极为重要,避免了环路的出现
println(edgelist[i].v+ "" + edgelist[i].w);
count++;
union(edgelist[i].v,edgelist[i].w);//两点合并
}
i++;
}
}

浙公网安备 33010602011771号