普利姆算法解决最小生成树问题

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-17 02:58:39

在这里插入图片描述普利姆算法就是从第一个顶点出发,每次都选择已访问节点的最短相邻节点,最后将所有节点都访问,代码:

/**
 * 普利姆算法解决最小生成树问题
 */
public class PrimAlgorithm {
    public static void main(String[] args) {
       char[] data = {'A','B','C','D','E','F','G'};
       int verx = data.length;
       //二维数组表示邻接矩阵,10000表示两点不连通
       int[][] weight = {
               {10000,5,7,10000,10000,10000,2},
               {5,10000,10000,9,10000,10000,3},
               {7,10000,10000,10000,8,10000,10000},
               {10000,9,10000,10000,10000,4,10000},
               {10000,10000,8,10000,10000,5,4},
               {10000,10000,10000,4,5,10000,6},
               {2,3,10000,10000,4,6,10000}
       };

        MGraph mGraph = new MGraph(verx);
        MinTree minTree = new MinTree();
        minTree.createMGraph(mGraph,verx,data,weight);
        minTree.printMGraph(mGraph);
        //测试普利姆算法
        minTree.createMinTree(mGraph,0);
    }
}

//最小生成树
class MinTree{
    /**
     * 生成图的方法
     * @param mGraph  图对象
     * @param verx    图顶点个数
     * @param data    顶点数据
     * @param weight   图的邻接矩阵
     */
   public void createMGraph(MGraph mGraph,int verx,char[] data,int[][] weight){
       for(int i = 0;i<verx;i++){
           mGraph.data[i] = data[i];
           for(int j = 0;j<verx;j++){
               mGraph.weight[i][j] = weight[i][j];
           }
       }
   }

   //输出图的邻接矩阵的方法
    public void printMGraph(MGraph mGraph){
       for(int[] link:mGraph.weight){
           System.out.println(Arrays.toString(link));
       }
    }

    /**
     * 生成最小生成树
     * @param mGraph  图对象
     * @param v       表示从哪个顶点开始
     */
    public void createMinTree(MGraph mGraph,int v){
        //记录已经被访问过的顶点,默认为0,还没访问
        int[] visited = new int[mGraph.verx];
        //记录两个被连接的顶点
        int h1 = -1;
        int h2 = -1;
        int min = 10000;//记录每次遍历时,最短路径,初始值为10000
        //初始顶点设置为已访问
        visited[v] = 1;
        for(int k = 1;k<mGraph.verx;k++){//表示verx个顶点 需要 verx-1条边,所以循环verx-1次
            //遍历所有顶点
            for(int i = 0;i<mGraph.verx;i++){
                for(int j = 0;j<mGraph.verx;j++){
                    //表示筛选出已经访问过的节点  的未访问的邻节点,并且边最小的两个顶点
                    if(visited[i] == 1 && visited[j] == 0 && mGraph.weight[i][j]<min){
                        min = mGraph.weight[i][j];
                        h1 = i;
                        h2 = j;
                    }
                }
            }
            //找到一条边是最小的
            System.out.println("边<"+mGraph.data[h1]+","+mGraph.data[h2]+">:权值"+min);
            //将h1,h2设置为已访问
            visited[h2] = 1;
            //重置min
            min = 10000;
        }

    }
}

//图
class MGraph{
    int verx;//表示图节点的个数
    char[] data;//存放节点
    int[][] weight;//存放边,就是邻接矩阵

    public MGraph(int verx) {
        this.verx = verx;
        data = new char[verx];
        weight = new int[verx][verx];
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!