Prim算法、Kruscal算法、Dijkstra算法、Floyd算法

prim算法

 

//创建最小生成树->村庄的图

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, 表示没有访问过

//   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顶点,普利姆算法结束后,有 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;

             }

           }

        }

        //找到一条边是最小

        System.out.println("<" + graph.data[h1] + "," + graph.data[h2] + "> 权值:" + minWeight);

        //将当前这个结点标记为已经访问

        visited[h2] = 1;

        //minWeight 重新设置为最大值 10000

        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];

   }

}

 

四十六、Kruscal算法

 

import java.util.Arrays;

 

public class KruskalCase {

 

   private int edgeNum; //边的个数

   private char[] vertexs; //顶点数组

   private int[][] matrix; //邻接矩阵

   //使用 INF 表示两个顶点不能连通

   private static final int INF = Integer.MAX_VALUE;

  

   public static void main(String[] args) {

     char[] vertexs = { 'A', 'B', 'C', 'D', 'E', 'F', 'G'};

     //克鲁斯卡尔算法的邻接矩阵 

         int matrix[][] = {

         /*A*//*B*//*C*//*D*//*E*//*F*//*G*/

   /*A*/ {   0,  12, INF, INF, INF,  16,  14},

   /*B*/ {  12,   0,  10, INF, INF,   7, INF},

   /*C*/ { INF,  10,   0,   3,   5,   6, INF},

   /*D*/ { INF, INF,   3,   0,   4, INF, INF},

   /*E*/ { INF, INF,   5,   4,   0,   2,   8},

   /*F*/ {  16,   7,   6, INF,   2,   0,   9},

   /*G*/ {  14, INF, INF, INF,   8,   9,   0}};

         //大家可以在去测试其它的邻接矩阵,结果都可以得到最小生成树.

        

         //创建KruskalCase 对象实例

         KruskalCase kruskalCase = new KruskalCase(vertexs, matrix);

         //输出构建的

         kruskalCase.print();

         kruskalCase.kruskal();

        

   }

  

   //

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值