(Java)数据结构——图(第五节)Kruskal的实现最小生成树(MST)

前言

本博客是博主用于复习数据结构以及算法的博客,如果疏忽出现错误,还望各位指正。

Kruskal算法(Kruskal的实现原理)

Kruskal算法的原理:

就是每次取最小的边,看看是不是与已经选择的构成回路,不构成回路,就加进来,继续,直到选了N-1条边。

对于判断回路来说,BFS和DFS应该是都可以的(类似于判断连通分量),但是,之前已经写过BFS和DFS代码了,所以在这里用并查集实现(当然,博主自己没试过DFS和BFS,感兴趣的可以自己去试一试)。

还是这个图,底下的是使用排序排好序的EData类。

Kruskal 的实现代码

首先,我们可以把排序的代码单拎出来

//用于对之前定义的to进行排序
    public void toSort(){
        Collections.sort(this.to, new Comparator<EData>() {
            @Override
            public int compare(EData o1, EData o2) {
                //顺序对就是升序,顺序不对就是降序,比如我现在是o1和o2传进来,比较时候o1在前就是升序,o1在后就是降序
                int result = Integer.compare(o1.weight,o2.weight);
                return result;
            }
        });
    }

之后因为要用到并查集,我们把并查集的基本代码拎出来

//并查集查找
    public int find(int x,int[] f){
        while(x!=f[x]){
            x = f[x];
        }
        return x;
    }
    //并查集合并
    public int union(int x,int y,int[] f){
        find(x,f);
        find(y,f);
        if(x!=y){
            f[x] = y;
            return y;
        }
        return -1;    //如果一样的集合就返回-1
    }

之后就来首先Kruskal,注意最后返回的是一个ArrayList,为了方便看选的哪条边,我就直接把两头都加进去了,有需要的话,自行更改代码即可

public  ArrayList<Integer> kruskal(){
        //kruskal是对form to weight这种结构的类进行排序,然后选取最短的一条边,看是否形成回路,加入
        toSort();    //调用toSort进行排序
        //由于要判断是否形成回路,我们在这用并查集
        //初始化并查集
        int[] f = new int[vertexList.size()];
        for(int i = 0;i<vertexList.size();i++){
            f[i] = i;
        }
        ArrayList<Integer> res = new ArrayList<>();
        int count = 0;
        for(int i = 0;count != vertexList.size()-1 && i<this.to.size();i++){
            //之后就是开始取边了
            EData temp = this.to.get(i);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值