普里姆(Prim)算法

普里姆算法是图论中的一种算法,可在加权连通图里搜索最小生成树。
举个例子来说就是要在v0 - v8 9个村子中架设电缆下图是每个村庄之间的距离
这里写图片描述

普里姆算法的作用就是让线路连线的公里数最少。

如图所示一共有九个顶点,构建如下图所示的二维数组 数组中我们使用65535代表无穷
这里写图片描述

`

1.   /**
2.      * 普利姆算法
3.      */
4.     public void prim(){
5.         int i,j,k;
6.         int adjvex[] = new int[9];
7.         int lowcost[] = new int[9];
8.         int min[] = new int[9];//最小路径数组
9.         lowcost[0] = 0;//等于0 表示此点的权值已经确定   等于具体的数值 表示距此点的权值
10.         adjvex[0] = 0;
11.
12.         /**
13.          * 循环除下标为0外的全部顶点
14.          */
15.         for (i = 1;i<G.length;i++){
16.             lowcost[i] = G[0][i];
17.             adjvex[i] = 0;
18.         }
19.         /**
20.          * 循环整个过程构造最小生成树 即最小距离
21.          */
22.         for (i = 1;i<G.length;i++){
23.             min[i] = 1234;
24.             j = 1;k = 0;
25.             /**
26.              * 取 顶点K的最小权值   即与顶点K连接的最小距离
27.              */
28.             while (j<G.length){
29.                 if (lowcost[j] !=0&&lowcost[j]<min[i]){//取 顶点K的最小权值   即与顶点K连接的最小距离
30.                     min[i] = lowcost[j];
31.                     k = j;
32.                 }
33.                 j++;
34.             }
35.
36.             System.out.println(adjvex[k]+"         "+k);
37.             lowcost[k] = 0; //顶点K的权值已确定
38.
39.             for (j = 1;j<G.length;j++){
40.                 if (lowcost[j]!=0&&G[k][j]<lowcost[j]){
41.                     lowcost[j] = G[k][j];
42.                     adjvex[j] = k;
43.                 }
44.             }
45.         }
46.         for (int m = 0;m<min.length;m++){
47.             System.out.println(min[m]+"         ");
48.
49.         }
50.}`

其中第39-44行j 循环从1 到8, 因k = 1,查找邻接矩阵的第v1行的各个权值,与lowcost数组对应值比较,若更小则修改lowcost值,并将k值存入adjvex数组中。所以最终lowcost = { 0,0, 18, 65535, 65535, 11, 16, 65535, 12 }。 adjvex数组的值为 {0, 0, 1, 0, 0, 0, 1, 0, 1 }。这里的if判断也表示v0和v1已经是生成树的顶点不参与最小权值的比对了

至此第一次循环结束 第二次循环开始lowcost = { 0,0, 18, 65535, 65535, 11, 16, 65535, 12 },adjvex数组的值为 {0, 0, 1, 0, 0, 0, 1, 0, 1 },所以我们得到k = 5,adjvex[5] = 0,表示v0至v5边为最小生成树的第二条边。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值