最短路径Java代码

最短路径Dijkstra的思想我就不写了,大家自己在网上看吧。我直接上代码了。 

 

public static void main(String[] args) {
        System.out.println("请输入节点数");
        Scanner sc = new Scanner(System.in);
        int count = sc.nextInt();

        // 创建一个领结矩阵数组
        int[][] arr = makeArr(count);

        // 创建三个数组并且初始化
        List<Integer> s = new ArrayList<>();
        s.add(0);

        int[] v = new int[count - 1];
        for (int i = 1; i < count; i++) {
            v[i - 1] = i;
        }

        int[] dist = new int[count];
        dist[0] = 0;
        for (int i = 1; i < count; i++) {
            dist[i] = -1;
        }
        
        //创建一个字符数组存放点
        String[] dit = new String[] {"B","C","D","E","F","G","H","L"};
        
        //创建一个字符数组来保存路径
        String[] path = new String[count];
        path[0] = "A";

        String[] p = function(s, v, arr, dist, 0, dit, path);
        
        for(int i = 1; i < p.length ; i++) {
            System.out.println(p[i]);
        }
        
    }

        // 迭代操作,i代表操控哪一行
        public static String[] function(List<Integer> s, int[] v, int[][] arr, int[] dist, int i,String[] dit, String[] path) {
            // 定义两个变量来记录最小值,和所在的列
            int min = 200;
            int row = 0;

            // 取出第i行领结矩阵的值并进行相关操作
            for (int k = 0; k < v.length; k++) {
                if (v[k] != 0) {
                    int j = v[k];
                    
                    //判断交换的
                    if (arr[i][j] <= min && arr[i][j] != 0) {
                        min = arr[i][j];
                        row = j;
                    }
                    
                    int add = dist[i] + arr[i][j];
                    //更新最短路径值
                    if (arr[i][j] != 0 && (add < dist[j] || dist[j] == -1)) {
                        dist[j] = add;
                        //创建路径也会自动更新,奇迹
                        path[j] = path[i]+"-->"+dit[j-1];
                    }            
                }
            }
            
            // 更新两个集合
            s.add(v[row - 1]);
            v[row - 1] = 0;

            //递归操作
            if (s.size() != v.length + 1) {
                function(s, v, arr, dist, row, dit , path);
            }

            //结果路径
            return  paths(path,dist);

        }
        
        //对结果进行处理
        public static String[] paths(String[] path, int [] dist) {
            String[] strPath = new String[path.length];
            for(int i = 0; i< path.length; i++) {
                strPath[i] = ""+path[i]+"   "+dist[i];
            }
            return strPath;
        }
     
        // 创建数组
        public static int[][] makeArr(int count) {
            Scanner sc = new Scanner(System.in);
            //创建一个数组
            int[][] arr = new int[count][count];
            System.out.println("请输入图的边数");
            int bians = sc.nextInt();
            System.out.println("输入边和边长");
            for(int i = 0; i < bians; i++) {
                int x = sc.nextInt()-1;
                int y = sc.nextInt()-1;
                int val = sc.nextInt();
                arr[x][y] = val;
                arr[y][x] = val;
            }
            return arr;

        }
 

实际效果展示

 这就是起始点到其它点的最短路径

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值