- 浏览: 604228 次
- 来自: ...
文章分类
最新评论
-
lgh1992314:
相同的元素呢
一种离散化方法 -
HelloSummerR:
圆心的位置是随机的,于是圆的部分会落到canvas外,那样就显 ...
HTML5 Canvas学习笔记(1)处理鼠标事件 -
hlstudio:
好久没见到sokuban了,这有个java版的,带源码,可以参 ...
求推箱子的最小步数(java) -
肖泽文:
太好了,谢谢你。。有中文注释!
HTML5 推箱子游戏过关演示动画 -
swm8023:
删除操作,将最后一个叶子节点插入后也有可能上浮吧
彻底弄懂最大堆的四种操作(图解+程序)(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 到其它各顶点的最短路径全部求出为止。
对于下图:
运行结果:
从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
下载源码:
一.最短路径的最优子结构性质
该性质描述为:如果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
下载源码:
发表评论
-
图的深搜+回溯练习题:POJ2197
2013-01-18 15:53 1679POJ 2197题意: 给定n个城市及其之间的距离,以及距 ... -
图的练习题(有解答)
2012-12-27 22:23 26581. 填空题 ⑴ 设无向图G ... -
邻接表实现图的广搜和深搜(java模板)
2012-12-11 17:04 2463//邻接表实现图的广搜和深搜(java模板) impor ... -
邻接矩阵实现图的广搜和深搜(java模板)
2012-12-10 20:37 1919经常要用到,放到这里备用!! //邻接矩阵实现图的广搜和深搜 ... -
如何求无向图的最小环
2012-11-13 19:02 2797POJ1734 题意:给定一个N个点的无向图,求一个最小环(各 ... -
深度优先搜索输出有向图中的所有环(JAVA)
2012-11-06 14:22 9626如图:求出有向图的所有环。 import java.uti ... -
三种算法(Floyd、Dijkstra、SPFA)求单源点最短路径。
2012-11-05 13:15 1865题(HDU2544): 在每年的校赛里,所有进入决赛 ... -
Dijkstra算法解HDU1874
2012-11-05 10:15 1364Dijkstra算法是用来解 ... -
SPFA算法求单源最短路径
2012-11-04 23:00 1943很多时候,给定的图存在负权边,这时类似Dijkstra等算法 ... -
图解Bellman-Ford算法
2012-11-03 19:39 5941Bellman-Ford算法: ... -
Bellman-Ford算法教学PPT
2012-11-03 12:06 1456Dijkstra算法是处理单源最短路径的有效算法,但它 ... -
昆虫的同性恋
2012-11-01 19:21 1398题目大意: 输入一个数t,表示测试组数。然后每组第一行两 ... -
拓扑排序入门练习
2012-11-01 16:51 1582拓扑排序简单来说 ... -
并查集入门精讲,实例2个(JAVA)
2012-10-30 14:47 4070一、什么是并查集 ... -
无前趋的顶点优先的拓扑排序方法(JAVA)
2012-10-28 20:20 1883无前趋的顶点优先的拓扑排序方法 该方法的每一步总是输 ... -
Kruskal算法和prim算法求最小生成树学习小结(JAVA)
2012-10-26 14:02 5051prim算法是用来实现图最小生成树的2种常用方法之一,P ... -
图的邻接表存储及遍历(JAVA)
2012-10-10 10:58 5427为图的每个顶点所发出的边建立一个单链表,用一顶点数组存储 ... -
弗洛伊德(Floyd)算法求任意两点间的最短路径
2012-10-01 07:46 6304Floyd-Warshall算法(Floyd-Warsha ... -
深度优先搜索与有向无环图的拓扑排序(java实现)
2012-09-11 13:05 5543当每个任务有前后置关系时,需要找到一种满足前后置关系的路 ... -
最小生成树:Kruskal(克鲁斯卡尔)算法实现(java)
2012-09-01 20:50 2636算法描述:Kruskal(克鲁斯卡尔)算法需要对图的边进行访问 ...
相关推荐
java算法分析与设计之单源最短路径(Dijkstra算法)源代码 算法作为计算机专业学生的必修课,同时也是软件开发过程中必备的编程思想,对学习研究计算机专业意义重大;正因为这门课程难,所以除了相关方面的书籍,网络...
本篇文章将深入探讨单源最短路径的概念、Dijkstra算法的原理,并通过一个具体的Java实现案例来理解其实际应用。 #### 单源最短路径概念 单源最短路径问题旨在找到一个加权图中从给定源节点到其余所有节点的最短...
在实际应用中,单源最短路径算法不仅限于C++,也可以在其他编程语言中实现,如Java、Python等。无论使用哪种语言,理解算法背后的逻辑和数据结构是至关重要的,这将帮助你更有效地解决问题并进行代码实现。
其次,Dijkstra算法由荷兰计算机科学家艾兹格·迪科斯彻提出,主要用于寻找单源最短路径。Dijkstra算法采用贪心策略,每次选择当前未访问节点中距离源点最近的一个加入到最短路径集合中。它保证了路径的正确性,但不...
Dijkstra算法是由荷兰计算机科学家艾兹格·迪科斯彻在1956年提出的,主要用于解决单源最短路径问题。它保证找到的路径是最优的,即每次扩展的边都是当前未访问节点中最短的。Dijkstra算法的基本思想是使用优先队列...
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实现单源最短路径" java实现单源最短路径是使用java语言实现的单源最短路径算法。该算法使用Dijkstra算法,采用邻接表表示图,通过构建邻接表来实现单源最短路径的计算。 单源最短路径算法是一种常用的图算法...
由Dijkstra贪心算法实现,设置顶点集合实现贪心扩充直到找到源点到所有顶点的路径长度;用dist数组记录当前从源到顶点的最短特殊路径长度
本篇文章主要解析一个关于单源最短路径(Single Source Shortest Path, SSSP)算法在MapReduce框架下的实现源代码。单源最短路径问题是指在一个带有权重的有向图或无向图中找到从一个指定的起点到所有其他顶点的最短...
3. **Dijkstra算法**:Dijkstra算法是最常用的解决单源最短路径问题的算法,由Edsger W. Dijkstra提出。它通过维护一个优先队列,逐步找到从源点到各个顶点的最短路径。每次从队列中取出距离源点最近的顶点,并更新...
Dijkstra算法是最常用的单源最短路径算法,用于找到图中一个顶点到其他所有顶点的最短路径。在无向图中,Dijkstra算法通过维护一个优先队列(通常是二叉堆)来逐步扩展最短路径树。每次从队列中取出距离源点最近的...
**Dijkstra最短路径算法**是图论中的一个重要算法,由荷兰计算机科学家艾兹格·迪科斯彻在1956年提出,主要用于解决单源最短路径问题。这个算法能够找到图中一个起点到其他所有顶点的最短路径,尤其适用于有向图或无...
Dijkstra算法是一种解决有向图中单源最短路径问题的高效算法,前提条件是图中所有边的权重必须是非负的。该算法的核心思想是使用贪心策略,逐步扩展从源点出发的最短路径。算法维护了一个集合S,包含了已找到最短...
java使用Dijkstra算法实现单源最短路径 Dijkstra算法是解决单源最短路径问题的经典算法,该算法由荷兰计算机科学家Edsger W. Dijkstra于1959年提出。单源最短路径问题是指在图中找出从给定顶点到其它任一顶点的最短...
在这个压缩包中,包含的文件主要围绕两种算法来解决这一问题:单源最短路径算法Dijkstra和多源最短路径算法Floyd-Warshall,以及它们在不同数据结构上的实现。 1. Dijkstra算法:由荷兰计算机科学家艾兹格·迪科斯...
总的来说,Dijkstra算法是解决单源最短路径问题的有效工具,通过合理的数据结构和巧妙的优化策略,可以在Java等编程语言中高效实现。理解并掌握这个算法,对于学习图论和算法设计具有重要意义。
Dijkstra算法,由荷兰计算机科学家艾兹格·迪科斯彻于1956年提出,是一种用于在图中寻找单源最短路径的算法。它适用于加权有向图或无向图,且所有边的权重都是非负的。这个算法的核心思想是通过逐步扩展最短路径树来...
数据结构课程实践:1. 问题描述: 以顶点表示校平面图中各景点,要有景点名称、代号、简介等信息;以边表示路径,存放路径长度等...(2)解决单源点最短路径问题;(3)任意两个景点之间的最短路径。 我用java实现的