最小生成树(java)

概念:在含有n个顶点的连通网中选择n-1条边,构成一颗极小连通子图,并使该连通子图中n-1条边上的权值之和达到最小,则称这颗连通子图为连通网的最小生成树
{
1.环境:连通网
2.选取n-1条边
3.连通子图
4.权值最小
}
克鲁斯卡尔算法
边按照权值递增顺序排列,循环按顺序取边,若形成环则此边不取,修改连通分量,直到选取了n-1条边停止循环(n为顶点个数)
形成环的条件:起始顶点和结束顶点在同一个连通分量(子图)中

//边
public class Edge implements Comparable{
    int start;    //起始顶点
    int end;      //结束顶点
    int weight;   //权值

    public Edge(int start, int end, int weight) {
        this.start = start;
        this.end = end;
        this.weight = weight;
    }

    //按照权值递增排列
    @Override
    public int compareTo(Edge o) {
        return this.weight-o.weight;
    }

    @Override
    public String toString() {
        return "Edge{" +
                "start=" + start +
                ", end=" + end +
                ", weight=" + weight +
                '}';
    }
}
//克鲁斯卡尔算法
public class Kruskal {

    /**
     *
     * @param vertex 顶点集合
     * @param list 边代表连通网
     * @return 返回最小生成子图的边的集合
     */
    public static List minTree(int[] vertex, List list){
        List edges = new ArrayList<>();
        //按照权值递增排序
        Collections.sort(list);
        //记录连通分量(顶点之间有边相连)
        ArrayList> records =  new ArrayList<>();
        //记录list的索引
        int index = 0;
        //遍历边集合 当选择的边数大于等于顶点个数-1停止循环
        while(edges.size() list1 = records.get(i);
                for(int j=0;j list1 = new ArrayList<>();
                    list1.add(edge.start);
                    list1.add(edge.end);
                    records.add(list1);
                }else if(x1==-1){
                    //起始顶点不在连通分量中
                    ArrayList list1 = new ArrayList<>();
                    list1.add(edge.start);
                    records.add(list1);
                }else if(x2==-2){
                    //结束顶点不在连通分量中
                    ArrayList list1 = new ArrayList<>();
                    list1.add(edge.end);
                    records.add(list1);
                }else{
                    //双顶点都在连通分量中,此时要合并v1与v2所在的连通分量
                    records.get(x1).addAll(records.get(x2));
                    records.remove(x2);
                }
            }
        }
        return edges;
    }

    public static void main(String[] args) {
        int[] vertex ={1,2,3,4,5,6};
        List list = new ArrayList<>();
        list.add(new Edge(1,2,6));
        list.add(new Edge(1,3,1));
        list.add(new Edge(1,4,5));
        list.add(new Edge(2,3,5));
        list.add(new Edge(2,5,3));
        list.add(new Edge(3,4,5));
        list.add(new Edge(3,5,6));
        list.add(new Edge(3,6,4));
        list.add(new Edge(4,6,2));
        list.add(new Edge(5,6,6));

        List edges1 = Kruskal.minTree(vertex, list);
        System.out.println(edges1);
    }
}

你可能感兴趣的:(数据结构与算法)