`
128kj
  • 浏览: 583581 次
  • 来自: ...
社区版块
存档分类
最新评论

单源最短路径( Dijkstra算法)JAVA实现

    博客分类:
阅读更多
      单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。在弄清楚如何求算单源最短路径问题之前,必须弄清楚最短路径的最优子结构性质。

一.最短路径的最优子结构性质

   该性质描述为:如果P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,k和s是这条路径上的中间顶点,那么P(k,s)必定是从k到s的最短路径。下面证明该性质的正确性。

   假设P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,则有P(i,j)=P(i,k)+P(k,s)+P(s,j)。而P(k,s)不是从k到s的最短距离,那么必定存在另一条从k到s的最短路径P'(k,s),那么P'(i,j)=P(i,k)+P'(k,s)+P(s,j)<P(i,j)。则与P(i,j)是从i到j的最短路径相矛盾。因此该性质得证。

二.Dijkstra算法

  Dijkstra提出按各顶点与源点v间的路径长度的递增次序,生成到各顶点的最短路径的算法。既先求出长度最短的一条最短路径,再参照它求出长度次短的一条最短路径,依次类推,直到从源点v 到其它各顶点的最短路径全部求出为止。

public class Dijkstra {
    static int M=10000;(此路不通)
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[][] weight1 = {//邻接矩阵
                {0,3,2000,7,M},
                {3,0,4,2,M},
                {M,4,0,5,4},
                {7,2,5,0,6},    
                {M,M,4,6,0}
        };


        int[][] weight2 = {
                {0,10,M,30,100},
                {M,0,50,M,M},
                {M,M,0,M,10},
                {M,M,20,0,60},
                {M,M,M,M,0}
        };
        int start=0;
        int[] shortPath = Dijsktra(weight2,start);
        
        for(int i = 0;i < shortPath.length;i++)
             System.out.println("从"+start+"出发到"+i+"的最短距离为:"+shortPath[i]);  
          
    }
    

    public static int[] Dijsktra(int[][] weight,int start){
     //接受一个有向图的权重矩阵,和一个起点编号start(从0编号,顶点存在数组中)
        //返回一个int[] 数组,表示从start到它的最短路径长度
        int n = weight.length;        //顶点个数
        int[] shortPath = new int[n];    //存放从start到其他各点的最短路径
        String[] path=new String[n]; //存放从start到其他各点的最短路径的字符串表示
         for(int i=0;i<n;i++)
             path[i]=new String(start+"-->"+i);
        int[] visited = new int[n];   //标记当前该顶点的最短路径是否已经求出,1表示已求出
        
        //初始化,第一个顶点求出
        shortPath[start] = 0;
        visited[start] = 1;

        for(int count = 1;count <= n - 1;count++)  //要加入n-1个顶点
        {
 
            int k = -1;    //选出一个距离初始顶点start最近的未标记顶点
            int dmin = Integer.MAX_VALUE;
            for(int i = 0;i < n;i++)
            {
                if(visited[i] == 0 && weight[start][i] < dmin)
                {
                    dmin = weight[start][i];
                   
                    k = i;
                }  
                    
            }
           // System.out.println("k="+k);
             
            //将新选出的顶点标记为已求出最短路径,且到start的最短路径就是dmin
            shortPath[k] = dmin;

            visited[k] = 1;
  
            //以k为中间点,修正从start到未访问各点的距离
            for(int i = 0;i < n;i++)
            {                 
                if(visited[i] == 0 && weight[start][k] + weight[k][i] < weight[start][i]){
                     weight[start][i] = weight[start][k] + weight[k][i];
                   
                     path[i]=path[k]+"-->"+i;
                 
                }
                
            }  
     
        }
         for(int i=0;i<n;i++)
           System.out.println("从"+start+"出发到"+i+"的最短路径为:"+path[i]);  
         System.out.println("=====================================");
      
        return shortPath;
    }
}



对于下图:


运行结果:
从0出发到0的最短路径为:0-->0
从0出发到1的最短路径为:0-->1
从0出发到2的最短路径为:0-->3-->2
从0出发到3的最短路径为:0-->3
从0出发到4的最短路径为:0-->3-->2-->4
=====================================
从0出   发到0的最短距离为:0
从0出   发到1的最短距离为:10
从0出   发到2的最短距离为:50
从0出   发到3的最短距离为:30
从0出   发到4的最短距离为:60

下载源码:
  • 大小: 42.3 KB
分享到:
评论

相关推荐

    java算法分析与设计之单源最短路径(Dijkstra算法)源代码

    java算法分析与设计之单源最短路径(Dijkstra算法)源代码 算法作为计算机专业学生的必修课,同时也是软件开发过程中必备的编程思想,对学习研究计算机专业意义重大;正因为这门课程难,所以除了相关方面的书籍,网络...

    java单源最短路径(贪心算法)

    java单源最短路径(贪心算法) public class TheShortestWay { static int MAX_SIZE = 6; public static void dijkstra(int v, float[][] a, float[] dist, int[] prev) { int n = dist.length - 1; if (v ||...

    java解决单源最短路径

    由Dijkstra贪心算法实现,设置顶点集合实现贪心扩充直到找到源点到所有顶点的路径长度;用dist数组记录当前从源到顶点的最短特殊路径长度

    最短路径算法java

    最短路径算法java 单源点最短路径Dijkstra算法的JAVA实现

    java使用Dijkstra算法实现单源最短路径

    主要为大家详细介绍了java使用Dijkstra算法实现单源最短路径,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Dijkstra最短路径算法

    NULL 博文链接:https://tianyalinfeng.iteye.com/blog/1579525

    Dijkstra算法单源路径

    Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的...

    Network-Routing-Scheme:Dijkstra的使用斐波那契堆的单源最短路径算法及其有趣应用

    •实现了Dijkstra的“单源最短路径”算法,以查找和打印无向图中任意两个给定节点之间的最短路径 •通过使用斐波那契堆来存储该图,优化了算法的运行时复杂度 第2部分:路由方案: •对于网络中的每个路由器,借助...

    dijkstra算法实现两景点间最短路径

    数据结构课程实践:1. 问题描述: 以顶点表示校平面图中各景点,要有景点名称、代号、简介等信息;以边表示路径,存放路径长度等...(2)解决单源点最短路径问题;(3)任意两个景点之间的最短路径。 我用java实现的

    Dijkstra(迪杰斯特拉)算法模板

    Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业...

    java实现Dijkstra算法

    Dijkstra算法通过计算起始顶点到其他顶点的最短路径来解决单源最短路径问题。在示例代码中,我们使用数组distance来记录起始顶点到其他顶点的最短距离。 首先,我们初始化所有顶点的距离为无穷大(用Integer.MAX_...

    java源码路径-thorup:MikkelThorup确定性算法的Java实现,用于解决线性时空上具有正整数权重的无向图的经典单源最短路径问

    Thorup发现了第一个确定性算法,用于解决线性时间和空间中具有正整数权重的无向图的经典单源最短路径问题。 该算法需要一个层次化的存储桶结构来标识必须访问顶点的顺序,而又不会破坏该时间范围,从而避免了...

    java拼图源码代码-dijkstra-problem:图形单源最短路径问题的示例Java代码,并应用于桥梁和手电筒拼图

    一个简单的Java库,用于解决图形单源最短路径问题,这在数学或算法难题中很常见。 包括的示例应用程序。 基本用法 Dijkstra算法的主要代码在spdijklib模块内。 客户端应为ProblemState,ProblemStateFactory和...

    迪杰斯特拉求最短路径问题

    迪杰斯特拉算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都...

    maze-dijkstra-game:基于Dijkstra算法解决单源最短路径问题的小迷宫游戏

    我邀请您下载文件 Dijkstra-Maze-Game.jar 并尝试一下。 脚步: 1 / 加载一个已保存的迷宫或创建一个新迷宫。 2 / 键入“E”(空)或“W”(墙)以移除或设置实心块来构建地图。 3 / 通过点击选择一个方块来...

    dijkstra-performance:用于测试 Dijkstra 算法的框架

    该项目旨在测量最著名的单源最短路径算法之一,Dijkstra 最短路径算法的不同实现的性能。 我正在考虑使用现有的斐波那契堆的开源实现的具有二元堆和优先级队列的简单优先队列和斐波那契堆类型实现。 我在这个实验中...

    java8stream源码-CrackingTheCodingInterview:破解编码面试问题解决方案(InJava)

    单源最短路径(Dijkstra) 全源最短路径(Floyd Warshall) Prim 的 MST 克鲁斯卡尔的 MST 拓扑排序(例如用于确定多模块项目中的项目构建顺序) 约翰逊算法 图中的连接点 图中的桥梁 检测图中的循环 11.a Using BFS...

    实验报告5-16041321-黄继升1

    实验五:最短路径算法一、实验目的(1)理解路径松驰技术的思想(2)掌握迪杰斯特拉算法(Dijkstra)的基本思想二、实验内容实现单源最短路经的迪杰斯特拉算法

    算法导论(part2)

    ·对讨论单源最短路径的第24章做了重新组织,把对基本性质的证明移到了各自的节中。这种新的结构使我们可以更早地将注意力放在算法上。 ·第34.5节给出了对NP完全问题的一个有所扩展的综述,并新增了对哈密顿回路...

Global site tag (gtag.js) - Google Analytics