Prim算法JAVA版

感兴趣加上断点测试跑一遍

package sortdemo;

import java.util.Arrays;

public class Prim {
    public static void main(String[] args) {
        //测试看看图是否创建成功
        char[] data = new char[]{'A','B','C','D','E','F','G'};
        int verxs = data.length;
        //邻接矩阵的关系使用二维数组表示,10000这个大数,表示两个点不联通
        int [][]weight=new int[][]{
                //A B C D E F G
      /*A*/          {10000,5,7,10000,10000,10000,2},
      /*B*/          {5,10000,10000,9,10000,10000,3},
      /*C*/          {7,10000,10000,10000,8,10000,10000},
      /*D*/          {10000,9,10000,10000,10000,4,10000},
      /*E*/          {10000,10000,8,10000,10000,5,4},
      /*F*/          {10000,10000,10000,4,5,10000,6},
      /*G*/          {2,3,10000,10000,4,6,10000},};

        //创建Mgraph对象

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

//创建最小生成树->村庄的图
class MinTree{
    //创建图的邻接矩阵

    /**
     *
     * @param graph 图对象
     * @param verxs 图对应的顶点个数
     * @param data 图的各个顶点的值
     * @param weight 图的邻接矩阵
     */
    public void createGraph(MGraph graph,int verxs,char data[],int [][] weight){
        int i,j;
        for (i =0 ;i< verxs ;i++){  //顶点
            graph.data[i]=data[i];
            for (j=0 ;j<verxs;j++){
                graph.weight[i][j]=weight[i][j];
            }
        }
    }
    //显示图的邻接矩阵
    public void showGraph(MGraph graph){
        for (int[] link:graph.weight){
            System.out.println(Arrays.toString(link));
        }
    }

    //编写Prim算法得到最小生成树

    /**
     *
     * @param graph 图
     * @param v 表示从图的第几个顶点开始生成  'A'->0 'B'->1
     */
    public void prim(MGraph graph,int v){
        //visited[] 标记结点(顶点)是否被访问过
        int[] visited = new int[graph.verxs];
        //visited[] 默认元素的值都为0,表示没有访问过  JAVA语言默认为0
       /* for (int i =0 ;i<graph.verxs;i++){
            visited[i]=0;
        }*/

       //把当前结点标记为已访问
        visited[v] = 1;
        //h1和h2记录两个顶点的下标
        int h1 =-1;
        int h2=-1;
        int minWeight = 10000;//将minWeight 初始成一个较大值,后面遍历过程会被替换
        for (int k=1;k<graph.verxs;k++){ //因为有graph.verxs顶点,Prim算法结束后,有graph.verxs-1边
           //这个是确定每一次生成的子图,和那个结点的距离最近
            for (int i =0;i<graph.verxs;i++){//i结点表示被访问过的结点
                for (int j=0;j<graph.verxs;j++){//j结点表示还没有访问过的结点
                    if (visited[i]==1 && visited[j]==0 &&graph.weight[i][j]<minWeight){
                        //替换minWeight(寻找已经访问过的结点和未访问过的结点间的权值最小的边)
                        minWeight=graph.weight[i][j];
                        h1=i;
                        h2=j;
                    }
                }
            }
            //退出for循环时,找到一条边是最小
            System.out.println("边<" + graph.data[h1] + "," + graph.data[h2] + ">" + "权值" + minWeight);
            //将当前结点标记为已经访问
            visited[h2]=1;
            //重置minWeight为最大值  第二次寻找开始
            minWeight=10000;

        }
    }
}

//先建一个图
class MGraph{
    int verxs;   //表示图的节点个数
    char[] data;//存放结点数据
    int[][] weight; //存放边,就是我们的邻接矩阵
    public MGraph(int verxs){
        this.verxs=verxs;
        data=new char[verxs];
        weight = new int[verxs][verxs];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Java实现Prim算法的示例代码: ```java import java.util.Arrays; public class PrimAlgorithm { private static final int INF = Integer.MAX_VALUE; // 表示两个顶点之间没有边 public void prim(int[][] graph) { int numVertex = graph.length; // 图中顶点的数量 int[] lowCost = new int[numVertex]; // 存储当前顶点到最小生成树的最短距离 int[] closest = new int[numVertex]; // 存储当前顶点到最小生成树的最短距离的那个顶点 boolean[] visited = new boolean[numVertex]; // 存储当前顶点是否已经被访问过 // 初始化lowCost和closest数组 for (int i = 1; i < numVertex; i++) { lowCost[i] = graph[0][i]; closest[i] = 0; visited[i] = false; } visited[0] = true; // 将第一个顶点标记为已访问 // 依次将剩余的n-1个顶点加入到最小生成树中 for (int i = 1; i < numVertex; i++) { int minCost = INF; int nextVertex = -1; // 从当前未访问的顶点中找到到最小生成树距离最短的那个顶点 for (int j = 1; j < numVertex; j++) { if (!visited[j] && lowCost[j] < minCost) { minCost = lowCost[j]; nextVertex = j; } } // 将找到的顶点加入到最小生成树中 visited[nextVertex] = true; // 更新lowCost和closest数组 for (int j = 1; j < numVertex; j++) { if (!visited[j] && graph[nextVertex][j] < lowCost[j]) { lowCost[j] = graph[nextVertex][j]; closest[j] = nextVertex; } } } // 输出最小生成树 for (int i = 1; i < numVertex; i++) { System.out.println("Edge: " + closest[i] + " - " + i + ", weight: " + graph[closest[i]][i]); } } public static void main(String[] args) { int[][] graph = { {0, 6, 1, 5, INF, INF}, {6, 0, 5, INF, 3, INF}, {1, 5, 0, 5, 6, 4}, {5, INF, 5, 0, INF, 2}, {INF, 3, 6, INF, 0, 6}, {INF, INF, 4, 2, 6, 0} }; PrimAlgorithm prim = new PrimAlgorithm(); prim.prim(graph); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值