14.6 Prim算法实现最小生成树

目录

概念

代码实现


概念

代码实现

public class PrimAlgorithm {
    public static void main(String[] args) {
        //测试看看图是否创建ok
        char[] data = new char[]{'A','B','C','D','E','F','G'};
        int vertexs = data.length;
        //邻接矩阵的关系使用二维数组表示,10000这个大数,表示两个点不联通
        int [][]weight=new int[][]{
                {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 graph = new MGraph(vertexs);

        //创建一个MinTree对象
        MinTree minTree = new MinTree();
        minTree.createGraph(graph, vertexs, data, weight);
        //输出
        minTree.showGraph(graph);
        //测试普利姆算法
        minTree.prim(graph, 0);//
    }


}

/**
 * 创建最小生成树
 */
class MinTree{

    /**
     * 用于创建领接矩阵
     * @param mGraph 图
     * @param vertexs 节点数
     * @param data 节点数据
     * @param weight 边值
     */
    public void createGraph(MGraph mGraph, int vertexs , char[] data, int[][] weight){
        for (int i = 0; i < vertexs; i++) {
            // 创建值
            mGraph.data[i] = data[i];
            for (int j = 0; j < vertexs; j++) {
                //创建权值
                mGraph.weight[i][j] = weight[i][j];
            }
        }
    }

    // 用于展示节点
    public void showGraph(MGraph graph){
        for (int[] val : graph.weight) {
            System.out.println(Arrays.toString(val));
        }
    }

    //编写prim算法,得到最小生成树
    /**
     *
     * @param graph 图
     * @param v 表示从图的第几个顶点开始生成'A'->0 'B'->1...
     */
    public void prim(MGraph graph, int v) {
        // 根据节点个数创建访问表, 用于标识已经访问的节点
        boolean[] isVisible = new boolean[graph.vertexs];

        int h1 = -1;// 开头节点的下标
        int h2 = -1;// 结尾节点的下标
        int minWeight = 10000;// 最小权值
        int weight = 0; //总权值

        // 从 v 节点为头, 开始访问
        isVisible[v] = true;

        for (int k = 1; k < graph.vertexs; k++) { // 遍历所有节点

            // 遍历领接图
            for (int i = 0; i < graph.vertexs; i++) {

                for (int j = 0; j < graph.vertexs; j++) {
                    if(isVisible[i] && !isVisible[j] && graph.weight[i][j] < minWeight){
                        // 替换最小路径策略, 通过遍历当前 i 节点 的领接节点, 找到这些节点间的最短路径
                        minWeight = graph.weight[i][j];
                        h1 = i;
                        h2 = j;
                    }
                }
            }
            //找到一条边是最小
            System.out.println("边<" + graph.data[h1] + "," + graph.data[h2] + "> 权值:" + minWeight);
            weight += minWeight;

            //注意要把最小权值重新初始化, 并把找到的最小权值对应节点访问值确认
            minWeight = 1000;
            isVisible[h2] = true;


        }
        System.out.println("总权值为 = " + weight);

    }

}

/**
 * 创建图
 */
class MGraph{
    int vertexs; // 节点数
    char[] data; // 节点名称
    int[][] weight; // 节点权值  -> 边值

    public MGraph(int vertexs) {
        this.vertexs = vertexs;
        this.data = new char[vertexs];
        this.weight = new int[vertexs][vertexs];
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值