超简单实现普利姆算法

思路: 随便找出一个点,接着找出与这个点权值最小的路径,这样我们就有两个点了。

把这两个点看成一个大点,接着在剩余点中寻找与大点权值最小的路径,找到以后我们就有了一个更大的点。

以此类推,知道所有点都添加完毕。(如果没看懂代码里注解更清晰)。


import javax.swing.*;
import java.util.Arrays;
import java.util.HashMap;

/**
 * @author 王木风
 * @create 2020-08-25 10:36
 * 布鲁斯卡尔算法
 */
public class PrimAlgorithm {
    public static void main(String[] args) {
        HashMap<Integer, String> hashMap = new HashMap<>(); //下面这么写纯粹是省地方
        hashMap.put(0,"A");  hashMap.put(1,"B");
        hashMap.put(2,"C");  hashMap.put(3,"D");
        hashMap.put(4,"E");  hashMap.put(5,"F");
        hashMap.put(6,"G");
        int verxs = hashMap.size();
        int[][] onde = new int[verxs][verxs];
        onde[0][1] = 5;  onde[0][2] = 7;  onde[0][6] = 2;  onde[1][0] = 5;
        onde[1][3] = 9;  onde[1][6] = 3;  onde[2][0] = 7;  onde[2][4] = 8;
        onde[3][1] = 9;  onde[3][5] = 4;  onde[4][2] = 8;  onde[4][5] = 5;
        onde[4][6] = 4;  onde[5][3] = 4;  onde[5][4] = 5;  onde[5][6] = 6;
        onde[6][0] = 2;  onde[6][1] = 3;  onde[6][4] = 4;  onde[6][5] = 6;
        prinm(onde,hashMap);
    }

    public static void prinm(int[][] onde,HashMap<Integer,String> hashMap) {
        int nextNode = 0;    //存放下一个应该放的结点
        int nodeNumber = 1;  //记录共有几个顶点了
        int[] recordAfterNode = new int[hashMap.size()];
        while (nodeNumber<7) {  //因为7个结点
            int min = 100;
            int min2 = 100;
            HashMap<Integer, Integer> integerIntegerHashMap = new HashMap<>();  //存放每一行的最小值和列数(列数就是目标地点,行数是起始地点)
            int[] recordFrontNode = new int[nodeNumber];  //recordFrontNode容量随着顶点数而变化,里面存放的是已经遍历过的点
            System.arraycopy(recordAfterNode, 0, recordFrontNode, 0, recordFrontNode.length);
            for (int a :recordFrontNode) {
                for (int i = 0; i < hashMap.size(); i++) {
                    if (onde[a][i] < min && onde[a][i] > 0) {   //寻找最小值和列数
                        min = onde[a][i];
                        nextNode = i;
                    }
                }
                integerIntegerHashMap.put(min,nextNode);
                min = 100;
            }
            for (Integer integer :integerIntegerHashMap.keySet()) { //寻找每列最小值之间的最小值
                if (integer < min2 && integer > 0) {
                    min2 = integer;
                }
            }
            recordAfterNode[nodeNumber] = integerIntegerHashMap.get(min2);  //最终结果存放到recordAfterNode
            nodeNumber++;   //已经处理过的节点数+1
            for (int a :recordAfterNode) {  //处理过的点之间断开,防止出现闭环。我认为这也是区分贪心算法和普利姆算法的地方
                for (int b :recordAfterNode) {
                    onde[a][b] = 0;
                }
            }
        }
        for (int i :recordAfterNode) {
            System.out.print(hashMap.get(i)+"->");
        }
    }
}

如果还有不懂的地方欢迎留言或者私聊。
如果有错误的地方也欢迎大佬指正。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值