并查集实现Kruscal算法

并查集实现Kruscal算法

	克鲁斯卡尔算法:克鲁斯卡尔算法是一种用来寻找最小生成树的算法。在剩下的所有未选取的边中,找最小边,如果和已选取的边构成回路,则放弃,选取次小边。
 public void kruscal(){
        UnionSet unionSet=new UnionSet(vertex.length);
        List<Edge> result=new ArrayList<>();
        int count=0;
        double dis=0.0;
        boolean[] visited=new boolean[edges.length];
        for(boolean b : visited) b=false;
        int index;
        while (count<vertex.length-1){
            index=getLeastShortEdge(visited);
            if(!unionSet.isConnect(edges[index].getU(),edges[index].getV())) {
                ++count;
                unionSet.unite(edges[index].getU(),edges[index].getV());
                result.add(edges[index]);
                dis+=edges[index].getWeight();
            }
            visited[index]=true;
        }
        System.out.println("Kruscal算法生成的最小生成树的边(总权值为"+dis+"):");
        for(int i=0;i<result.size();++i) System.out.println(vertex[result.get(i).getU()]+","+vertex[result.get(i).getV()]+","+result.get(i).getWeight());
    }
    private int getLeastShortEdge(boolean[] visited){
        int i=0;
        while (visited[i]) ++i;
        double tmp=edges[i].getWeight();
        int index=i;
        while (++i<visited.length){
            if(!visited[i]&&edges[i].getWeight()<tmp) {
                tmp=edges[i].getWeight();
                index=i;
            }
        }
        return index;
    }

href:

发布了8 篇原创文章 · 获赞 0 · 访问量 635

猜你喜欢

转载自blog.csdn.net/qq_34262612/article/details/103333815