贪心算法之克鲁斯卡尔(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++;
    }
}
posted @ 2012-04-04 13:56  Lab_HIT  阅读(683)  评论(0)    收藏  举报