>>分享数据结构和算法相关的知识和技术 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 19839 个阅读者 刷新本主题
 * 贴子主题:  无向图的最短路径求解算法之——Dijkstra算法 回复文章 点赞(0)  收藏  
作者:sunshine    发表时间:2020-03-15 17:29:50     消息  查看  搜索  好友  邮件  复制  引用

    首先从图的遍历方式说起。在数据结构中,树的遍历方式有三种:先序遍历、中序遍历、后序遍历。图比树更为灵活,但是图的遍历方式只有两种:深度优先和宽度优先。

        Dijkstra 在本质上则是宽度优先。

      那么怎么记录路径呢?用一个一维数组就可以了。记录从到当前点的上一个点就OK 了,然后再回溯,就得出了路径了。

     代码如下:
import java.util.Arrays;

public class Dijkstra {

    private static final int inf=Integer.MAX_VALUE;//表示两个点之间无法直接连通

    public static int[] dijkstra(int[][] graph,int n,int u){

        int[] path=new int[n];

        int dist[]=new int[n];

        boolean s[]=new boolean[n];

        Arrays.fill(s, false);

        Arrays.fill(dist, inf);

        int min,v;

        for(int i=0;i<n;i++){

            dist[i]=graph[u][i];

            if(i!=u&&dist[i]<inf)path[i]=u;

            else path[i]=-1;

        }

        s[u]=true;

        while(true){

            min=inf;v=-1;

            //找到最小的dist

            for(int i=0;i<n;i++){

                if(!s[i]){

                    if(dist[i]<min){min=dist[i];v=i;}

                }

            }

            if(v==-1)break;//找不到更短的路径了

            //更新最短路径

            s[v]=true;

            for(int i=0;i<n;i++){

                if(!s[i]&&

                        graph[v][i]!=inf&&

                        dist[v]+graph[v][i]<dist[i]){

                    dist[i]=dist[v]+graph[v][i];

                    path[i]=v;

                }

            }

        }

        //输出路径

        int[] shortest=new int[n];

        for(int i=1;i<n;i++){

            Arrays.fill(shortest, 0);

            System.out.print(dist[i]+":");

            int k=0;

            shortest[k]=i;

            while(path[shortest[k]]!=0){

                k++;shortest[k]=path[shortest[k-1]];

            }

            k++;shortest[k]=0;

            for(int j=k;j>0;j--){

                System.out.printf("%d->",shortest[j]);

            }

            System.out.println(shortest[0]);

        }

        return dist;

    }

    public static void main(String[] args) {

         int[][] W = {

                    {  0,   1,   4,  inf,  inf,  inf },

                    {  1,   0,   2,   7,    5,  inf },

                    {  4,   2,   0,  inf,    1,  inf },

                    { inf,  7,  inf,   0,    3,    2 },

                    { inf,  5,    1,   3,   0,    6 },

                    { inf, inf,  inf,   2,   6,    0 } };

         dijkstra(W, 6, 0);

  }

}

  结果:

1:0->1

3:0->1->2

7:0->1->2->4->3

4:0->1->2->4

9:0->1->2->4->3->5

第一个数字表示最短路径,冒号后面的表示路径。配合http://sbp810050504.blog.51cto.com/2799422/690803里面的图看就很容易懂了。

注,用到的数据还是下的数据。http://sbp810050504.blog.51cto.com/2799422/690803下的数据。




----------------------------
原文链接:https://blog.51cto.com/sbp810050504/1272577

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-03-19 10:10:47 重新编辑]
  Java面向对象编程-->继承
  JavaWeb开发-->Servlet技术详解(Ⅱ)
  JSP与Hibernate开发-->Java对象持久化技术概述
  Java网络编程-->基于UDP的数据报和套接字
  精通Spring-->创建综合购物网站应用
  Vue3开发-->通过Axios访问服务器
  64匹马,8个赛道,找出跑得最快的4匹马
  算法学习与收集:一些有用的算法网站和网页
  图像基本处理算法的简单实现
  算法的概念、特征和基本类型简介
  haproxy调度算法
  进程调度算法总结
  基于SQL的数据库算法研究
  对称算法非对称算法哈希算法区别
  绕圆算法
  Binary Search二分查找算法
  算法优化策略之“中途相遇”算法思想
  面试官问我:什么是消息队列?什么场景需要他?用了会出现什...
  为什么要学数据结构?
  分析递归和迭代的区别、优缺点及实例对比
  数据结构中的数组
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。