java普利姆算法实现最短路径问题

在这里插入图片描述

思路:
1.先确认一个点查找他连接的最短路径的顶点,然后记录下该顶点,然后查到这两个顶点连接最短路径的顶点,不能出现回路,然后在判断这个三个依次累计,直到所有顶点全部连接
代码:

package com.wangyq.datastructrue.arithmetic;

/**
 * 普利姆算法- 修路问题 ,最小生成树
 */
public class PrimAlgorithm {

    public static void main(String[] args) {
        //构建图
        int[][] ints = new int[7][7];
        String[] names = new String[7];
        names[0] = "A";
        names[1] = "B";
        names[2] = "C";
        names[3] = "D";
        names[4] = "E";
        names[5] = "F";
        names[6] = "G";
        for (int[] ints1 : ints) {
            for (int i = 0; i < ints1.length; i++) {
                ints1[i] = Integer.MAX_VALUE;
            }
        }
        ints[0][1] = 5;
        ints[0][2] = 7;
        ints[0][6] = 2;
        ints[1][0] = 5;
        ints[1][3] = 9;
        ints[1][6] = 3;
        ints[2][0] = 7;
        ints[2][4] = 8;
        ints[3][1] = 9;
        ints[3][5] = 4;
        ints[4][2] = 8;
        ints[4][5] = 5;
        ints[4][6] = 4;
        ints[5][3] = 4;
        ints[5][4] = 5;
        ints[5][6] = 6;
        ints[6][0] = 2;
        ints[6][1] = 3;
        ints[6][4] = 4;
        ints[6][5] = 6;
        //构建最小生成树
        primAlgorithm(ints,names);
    }

    private static void primAlgorithm(int[][] ints, String[] names) {
        int[] peaks = new int[ints.length];
        int min = Integer.MAX_VALUE;
        int tempK = 0;
        int tempJ = 0;
        peaks[0] = 1;
        //n个顶点有n-1条路
        for (int i = 0; i < peaks.length - 1; i++) {
            //重置最短路径
            tempK = 0;
            tempJ = 0;
            min = Integer.MAX_VALUE;
            //循环已经联通的顶点
            for (int j = 0; j < peaks.length; j++) {
                if (peaks[j] == 0) {
                    continue;
                }
                for (int k = 0; k < peaks.length; k++) {
                    /*
                    1.当前路径是通的
                    2.没有构成回路
                    3.路径比记录的小
                     */
                    if (ints[j][k] < Integer.MAX_VALUE && peaks[k] == 0 && ints[j][k] < min) {
                        min = ints[j][k];
                        tempK = k;
                        tempJ = j;
                    }
                }
            }
            peaks[tempK] = 1;
            System.out.println("连接顶点"+names[tempJ]+"--"+names[tempK]);
        }
    }
}

运行结果:
连接顶点A–G
连接顶点G–B
连接顶点G–E
连接顶点E–F
连接顶点F–D
连接顶点A–C

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值