>>分享数据结构和算法相关的知识和技术 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 27101 个阅读者 刷新本主题
 * 贴子主题:  无向图的最短路径求解算法之——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开发-->使用过滤器
  JSP与Hibernate开发-->Java对象持久化技术概述
  Java网络编程-->Java网络编程入门
  精通Spring-->绑定CSS样式
  Vue3开发-->Vue组件开发高级技术
  Charges Convert Heads As soon as Luring ESPN Analyst Int...
  有关图片的LZW算法的原理
  图像基本处理算法的简单实现
  HAProxy 之 算法介绍
  java 通配符的应用范例, java 排序算法
  AES算法,DES算法,RSA算法JAVA实现
  Citrix Netscaler负载均衡算法
  活动安排问题(贪心算法)
  有趣的位图排序算法
  绕圆算法
  一种码位倒置算法
  面试官问我:什么是消息队列?什么场景需要他?用了会出现什...
  微软面试题:买卖股票的最佳时机
  RSA 非对称加密原理(小白也能看懂哦~)
  小米面试算法题:搜索旋转排序数组
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


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