图最短路径算法之迪杰斯特拉算法(Dijkstra)

    @Test
    void test(){
        final int M=10000;
        char[] vertices=new char[]{'A','B','C','D'};//顶点
        int[][] graph=new int[][]{//A点到其他点的距离
                    {0,2,M,6},
                    {2,0,3,2},
                    {M,3,0,2},
                    {6,2,2,0}
        };
        int [] dijkstra=dijkstra(graph,0);
        for (int i:dijkstra) {
            System.out.println(i);}
    }

    public static int[] dijkstra(int[][] graph,int start) {
        final int length=graph.length;
        int[] shortesPathArray=new int[length];//最后要return 这个 里面记录了start位置的节点到其它节点的距离
        int[] visitedArray=new int[length];//区分哪些点是看过的 哪些不是  0表示没看过 1表示看过

        shortesPathArray[start]=0;//自己到自己的距离为0
        visitedArray[start]=1;//表示这个节点是看过的

        for (int i = 1; i < length; i++) {//
            int k=-1;//记录点的  不知道赋值什么好 ,随便赋值一个 关系不大
            int disMin=Integer.MAX_VALUE;//超大距离 数值很大


            for (int j = 1; j < length; j++) {
                if(visitedArray[j]==0&&graph[start][j]<disMin){//某个点没有看过 并且到start的节点 小于disMin
                    disMin=graph[start][j];
                    k=j;
                }
            }//这个循环是在一堆点中找一个点,这个点的距离 ,离start点最近
            //循环完 就找到了在没有看过的 节点中 距离最小的 节点 k,距离是disMin

            visitedArray[k]=1;//这个点看过了
            shortesPathArray[k]=disMin;//这个k点到start点的距离

            for(int index=1;index<length;index++){
                if(visitedArray[index]==0 && //这个点没有看过 并且 这个点到start点 的距离, 中间有点 可以中转,距离最小
                        graph[start][k]+graph[k][index]<graph[start][index]){//以k为中间节点 是否有其他点可达 距离要比直达更短
                    graph[start][index]=graph[start][k]+graph[k][index];//有中转节点 使得距离最小
                }
            }
        }



        
        return shortesPathArray;
    }

如果没有单元测试 把test 函数内容写到main 方法里面

参考:图最短路径算法之迪杰斯特拉算法(Dijkstra) | Echo Blog

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值